除法表达式

【题目描述】

经过无尽的蘑菇和无尽的不知道错在哪里、不知道发生了什么只下,恭喜KZ成功的造出了数据!!可喜可贺可喜可贺

给出一个这样的除法表达式:X1/X2/X3/X4/X5/X6..../Xk,

正常的除法表达式是从左往右计算的,但是我们可以向其中添加括号,以改变它的运算顺序,如1/2/1/2=1/4  ,  (1/2)/(1/2)=1  ;

那么,  给定一个除法表达式,能否通过添加括号使它的值为正整数?

【输入格式】

多行

每行一个除法表达式

【输出格式】

多行

对应输入,分别输出“YES”(能为正整数)或“NO”(不能为正整数)

【样例输入】

8/4/7/10/99
6/8/5/2/3

【样例输出】

YES
NO

【提示】

3<=k<=10000 , 0<X<=0x7fffffff

【来源】

《算法竞赛入门经典(第2版)》第10章

 

题意 : 在任意位置处添加括号,问是否使得运算的结果是一个整数

思路分析 : 显然对于一个除法表达式,第一个元素一定是在分子的位置上,第二个元素一定是在分母的位置上,其余所有的元素都是在分子上,不断的求gcd约分即可,直到分母为 1 ,代表可以,否则是不可以。

代码示例 :

#define ll long long
const ll maxn = 5e5+5;
const ll mod = 1e9+7;
const double eps = 1e-9;
const double pi = acos(-1.0);
const ll inf = 0x3f3f3f3f;

char s[maxn];
ll num[10005];

ll gcd(ll a, ll b){
    return b==0?a:gcd(b, a%b);
}

int main() {
    freopen("baoquansl.in", "r", stdin);
    freopen("baoquansl.out", "w", stdout);
    
    while(~scanf("%s", s)){
        ll len = strlen(s);
        s[len] = '/';
        
        ll f = 0, k = 1;
        for(ll i = 0; i <= len; i++){
            if (s[i] == '/') {num[k++] = f; f = 0;}
            else {
                f = f*10+(s[i]-'0');
            }
        }
        
        //for(ll i = 1; i <k; i++) prllf("%d ", num[i]);
        swap(num[1], num[2]);
        ll sign = 0;
        for(ll i = 2; i < k; i++){ 
            ll g = gcd(num[1], num[i]);
            num[1] /= g;
        }
        if (num[1] == 1) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 

posted @ 2018-04-17 18:09  楼主好菜啊  阅读(800)  评论(0编辑  收藏  举报