除法表达式
时间限制:
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
-
首先输入一个N,表示有N组测试数据,
按照刘汝佳紫书上的第三种方法来做(p311);
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
char in[20010];
int X[10000];
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int judge(int *X,int k){
int i;
X[2]=X[2]/gcd(X[1],X[2]);
for(i=3;i<=k;i++){
X[2]=X[2]/gcd(X[i],X[2]);
}
return X[2];
}
int main(){
int n,j,k,num;
scanf("%d",&n);
while(n--){
memset(in, 0, sizeof(in));
memset(X, 0, sizeof(X));
scanf("%s",in);
k=0;
num=1;
while(in[k]!='\0'){
j=0;
while(in[k]!='/'&&in[k]!='\0'){
X[num]=X[num]+(in[k]-'0')*pow(10,j);
//cout<<"test "<<in[k]<<endl;
k++,j++;
}
k++;
num++;
}
num--;
//cout<<num<<endl;
if(judge(X,num)==1){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}