zoukankan      html  css  js  c++  java
  • 题解 P1572 【计算分数】

    字符串好题!其他题解可读性不高我来用最简单的思路讲解一遍吧

    分析:

    • 如果一个一个字符串的读入的话,处理起分子分母就会很麻烦,而读入时用scanf("%d/%d",&a,&b)的话就能轻松处理正负号的问题
    • 通分:由a*b=lcm(a,b)*gcd(a,b),得lcm(a,b)=a * b/gcd(a,b)

    本题坑点

    • 分母为1时需特判
    • 结果化成最简整数比:我们可以算每一次的时候都取一遍__gcd(a,b) <---这是库函数,不用手打一遍gcd,虽然也没有节省多少时间
    • 最坑的一点: 当分母为负时,e.g.2/-3 变成 -2/3
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define rep(i,a,b) for(ll i=a;i<=b;++i)
    #define dwn(i,a,b) for(ll i=a;i>=b;--i) 
     
    template <typename T> inline void rd(T &x){
    	x=0;char c=getchar();int f=0;
    	while(!isdigit(c)){f|=c=='-';c=getchar();}
    	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    	x=f?-x:x;
    }
    #define mem(a,b) memset(a,b,sizeof(a))
    
    int a,b,c,d;
    int ans1;//分子 
    int ans2;//分母 
    
    int main(){
        scanf("%d/%d",&a,&b);
        while(scanf("%d/%d",&c,&d)!=EOF){
            int gcd=__gcd(b,d);
            int lcm=b*d/gcd;
            ans2=lcm;//当前分母
            ans1=a*(lcm/b)+c*(lcm/d);//当前分子,请读者自主模拟一下
            a=ans1/(__gcd(ans1,ans2));//下一次计算时,a和b代表的是上一次计算的分子分母,顺便约个分
            b=ans2/(__gcd(ans1,ans2));
        }
        ans1=a;//最后一次处理后a就是ans1,这里赋值的原因是a与b约过一次分了
        ans2=b;//最后一次处理后b就是ans2
        
        if(ans2<0){//处理 2/-3 -> -2/3的情况 
            ans1=-ans1;
            ans2=-ans2;
        }
        if(ans2==1)printf("%d
    ",ans1);//处理分母为1的情况
        else printf("%d/%d
    ",ans1,ans2);
        return 0;
    }
    
  • 相关阅读:
    Hadoop(二)—— HDFS
    Hive(一)—— 启动与基本使用
    Flume(一) —— 启动与基本使用
    Kafka(四) —— KafkaProducer源码阅读
    Flink(一) —— 启动与基本使用
    Kafka(三) —— 集群监控
    Hadoop(一)—— 启动与基本使用
    Spark(二)—— 标签计算、用户画像应用
    二. python数组和列表
    一. python数据结构与算法
  • 原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11635468.html
Copyright © 2011-2022 走看看