码迷,mamicode.com
首页 > 其他好文 > 详细

除法表达式-最大公约数

时间:2015-07-30 21:22:47      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

除法表达式

时间限制: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即可知道是否可以变为整数
/*
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;
char str[maxn];
int gcd(int a,int b) {
    return b?gcd(b,a%b):a;
}
int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%s",str);
        bool flag=true;
        int x,y=0,cnt=0,n=strlen(str);
        for(int i=0; i<n; i++) {
            if(str[i]=='/') {
                y=atoi(str+i+1);
                break;
            }
        }
        for(int i=0; i<n; i++) {
            cnt++;
            x=atoi(str+i);
            while(str[i]!='/') {
                i++;
                if(i>=n)break;
            }
            if(cnt==2)continue;
            if(y==0)break;
            y/=gcd(x,y);
        }
        if(y>1)printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

除法表达式-最大公约数

标签:

原文地址:http://blog.csdn.net/qq_18661257/article/details/47156337

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!