除法表达式
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
给出一个这样的除法表达式:X1/X2/X3/···/Xk,其中Xi是正整数。除法表达式应当按照从左到右的顺序求和,例如表达式1/2/1/2的值为1/4。但是可以在表达式中嵌入括号以改变计算顺序,例如表达式(1/2)/(1/2)的值为1.
-
输入
-
首先输入一个N,表示有N组测试数据,
每组数据输入占一行,为一个除法表达式,
输入保证合法。
使表达式的值为整数。k<=10000,Xi<=100000000.
输出
- 输出YES或NO 样例输入
-
1 1/2/1/2
样例输出
-
YES
-
首先将数字要分离开来,然后就是x1一定只能是分子,x2一定是分母,那么让X1/X2/X3/···/Xk尽可能使整数的话,很明显,应该让分母的个数减少即分母除了x2之外不再有其他数字,所以问题转换成了(x1*x3*x4*x5....*xk)/x2是否为整数,可以用最大公约数,不断的减少x2的值,最后检查x2是否为1即可知道是否可以变为整数
-
/* Author: 2486 Memory: 1208 KB Time: 12 MS Language: C/C++ Result: Accepted */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int maxn=1e6+5; int T,cnt,n; char str[maxn]; int S[10000+5]; int gcd(int a,int b) { return b?gcd(b,a%b):a; } bool judge() { if(cnt<=1||S[0]==0)return true; int y=S[1]/gcd(S[0],S[1]); for(int i=2; i<cnt; i++) { y/=gcd(S[i],y); } if(y==1)return true; return false; } int main() { scanf("%d",&T); while(T--) { scanf("%s",str); cnt=0,n=strlen(str); for(int i=0; i<n; i++) { S[cnt++]=atoi(str+i); while(i<n&&str[i]!='/')i++; } printf("%s\n",judge()?"YES":"NO"); } return 0; }
-
首先输入一个N,表示有N组测试数据,