除法表达式(传送门)
时间限制:**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
ps: 不得不佩服lrj大牛的分析, 因为X2必须在分母的位置,其他数都可以放在分子的位置,那么每次将 Xi X i 和 X2 X 2 与 gcd(Xi,X2) g c d ( X i , X 2 ) 约分,直到 X2=1 X 2 = 1 时,结果才能为整数。
#include<iostream>
#include<sstream>
using namespace std;
const int maxn = 10004;
int a[maxn];
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
while(n--)
{
string exp;
cin>>exp;
stringstream ss(exp);
int index = 0;
char temp;
while(ss>>a[index]){
ss>>temp;
index++;
}
int t1 = gcd(a[0], a[1]);
a[1] /= t1;
if(a[1] == 1){
cout<<"YES"<<endl;
continue;
}
int flag = 0;
for(int i = 2; i < index; i++)
{
int tt = gcd(a[i], a[1]);
a[1] /= tt;
if(a[1] == 1){
flag = 1;
break;
}
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}