除法表达式
时间限制:
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即可知道是否可以变为整数。
-
#include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> using namespace std; char str[1000000]; int a[1000100]; int p=0,l; int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } int we()//判断x2是否是1,也就是a[1]是否为1 { if(a[0]==0||p<=1) return 1; int ni=a[1]/gcd(a[0],a[1]); for(int i=2;i<p;i++) { ni=ni/gcd(a[i],ni); } if(ni==1) return 1; else return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",str); l=strlen(str); p=0; for(int i=0;i<l;i++) { a[p++]=atoi(str+i);//atoi() 函数用来将字符串转换成整数(int) while(i<l&&str[i]!='/') { i++; } } if(we()==1) printf("YES\n"); else printf("NO\n"); } }
-
首先输入一个N,表示有N组测试数据,