背景:
教授在打某道关于序列gcd与lcm的题,但是看不懂题解,于是决定打表找规律;然而自己又懒得算数,于是写了个程序。
使用说明:
输入格式:n str a1 a2 ... an
,\(n\) 为序列长度;str为操作种类,只有GCD
和LCM
;\(a\) 为序列,其中所有元素都必须是自然数。
如果输入不合法,程序会中断计算并返回错误信息;否则会直接输出答案。
代码:
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ri register int
#define inf 0x3f3f3f3f
char c[4];
long long a,b;
unsigned long long ans;
il long long gcd(long long x,long long y)
{if(!x&&!y){return 1;}if(!x){return y;}if(!y){return x;}while(1){if(x<y){swap(x,y);}x%=y;if(!x){return y;}}
}
int main()
{while(1){scanf("%s",c);if(!strcmp(c,"GCD")){scanf("%lld",&a);if(a<0){puts("ERROR: 序列大小必须是自然数");continue;}ans=0;while(a--){scanf("%lld",&b);if(b<0){puts("ERROR: 序列元素必须是自然数");break;}ans=gcd(ans,b);}if(b>=0){printf("%lld\n",ans);}continue;}if(!strcmp(c,"LCM")){scanf("%lld",&a);if(a<0){puts("ERROR: 序列大小必须是自然数");continue;}ans=1;while(a--){scanf("%lld",&b);if(b<0){puts("ERROR: 序列元素必须是自然数");break;}ans/=gcd(ans,b);ans*=b;}if(b>=0){printf("%lld\n",ans);}continue;}puts("ERROR: 操作无效");}return 0;
}
/*
in:n op a_1...a_n
0<=a<=2^32
*/
效果不错。