除法表达式
时间限制:
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一定为分母,要使结果为整数,应尽量减少分母的个数,可以假设分母只有x2,也就是求(x1*x3*x4*....)/x2的结果是否为整数。可以使x2不断不的与x1,x3,x4...约去最大公约数,看最终结果是否为1,是则可以得到整数。
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; char s[1000010]; int a[1000100]; int p; //求最大公约数 int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b); } //不断地消除x2 int pan(){ if(p<=1||a[0]==0) return 1; int t=a[1]/gcd(a[0],a[1]); for(int i=2;i<p;i++){ t=t/gcd(t,a[i]); } if(t==1) return 1; else return 0; } int main(){ int n; scanf("%d",&n); while(n--){ scanf("%s",s); int l=strlen(s); p=0;//记录数字下标 for(int i=0;i<l;i++){ a[p++]=atoi(s+i);//atoi()函数将字符串转换为整数 while(i<l&&s[i]!='/') i++;//跳过'/' } if(pan()==1) printf("YES"); else printf("NO"); if(n!=0) printf("\n"); } }
-
首先输入一个N,表示有N组测试数据,