首页 > 其他分享 >洛谷题单指南-数学基础问题-P1572 计算分数

洛谷题单指南-数学基础问题-P1572 计算分数

时间:2024-04-15 14:12:43浏览次数:25  
标签:分数 P1572 洛谷题 a1 int b1 b2 分母

原题链接:https://www.luogu.com.cn/problem/P1572

题意解读:计算分数+、-运算的结果。

解题思路:

根据题目要求,逐项计算并约分,则不会超int,问题就比较直接了

定义a1/b1为前一项的分子分母,a2/b2为当前项的分子分母

依次遍历字符串,处理出分子和分母,本题的关键其实是字符串的处理

当读取到分子、分母后,存入a2、b2,并与a1、b1进行分数运算(a1初始值0,b1初始值1)

运算时可以这样处理:将分数前面的符号处理成1(正)或-1(负),并乘以分子,这样分数都可以用加法来运算

a1 = a1 * b2 + a2 * b1,b1 = b1 * b2

再a1、b1进行约分,

约分即a1 = a1 / gcd(abs(a1), abs(b1)),b1 = b1 / gcd(abs(a1), abs(b1))

最终输出结果即可。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int gcd(int a, int b)
{
    if(b == 0) return a;
    return gcd(b, a % b);
}

int main()
{
    int sign = 1; //符号
    int a1 = 0, b1 = 1; //前一个分子、分母
    int a2, b2; //后一个分子、分母
    bool up = true; //即将读入的是否是分子

    string s;
    cin >> s;

    for(int i = 0; i < s.size(); i++)
    {
        char c = s[i];
        if(c == '+') sign = 1;
        if(c == '-') sign = -1;
        if(c >= '0' && c <= '9')
        {
            int num = c - '0';
            int j;
            for(j = i + 1; s[j] >= '0' && s[j] <= '9'; j++) 
            {
                num = 10 * num + s[j] - '0'; //提取数字到num
            }
            i = j - 1; // i下次从最后一个数字后一个字符开始读
            if(up)
            {
                a2 = num * sign; //读入到分子,符号跟随分子
                up = !up; //下次读入到分母
            } 
            else 
            {
                b2 = num; //读入到分母
                //计算两个分数的和
                a1 = a1 * b2 + a2 * b1;
                b1 = b1 * b2;
                //cout << a1 << "/" << b1 << endl;
                //约分
                int g = gcd(abs(a1), abs(b1));
                a1 /= g;
                b1 /= g;

                up = !up; //下次读入到分子
            }
        }
        if(c == '/') continue;
    }

    if(a1 == 0) cout << 0;
    else if(b1 == 1) cout << a1;
    else cout << a1 << "/" << b1;
    return 0;
}

 

标签:分数,P1572,洛谷题,a1,int,b1,b2,分母
From: https://www.cnblogs.com/jcwy/p/18135833

相关文章

  • 洛谷题单指南-数学基础问题-P4057 [Code+#1] 晨跑
    原题链接:https://www.luogu.com.cn/problem/P4057题意解读:给定三个数,计算其最小公倍数。解题思路:三个数a、b、clcm(a,b,c)=lcm(lcm(a,b),c)100分代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;LLa,b,c;LLgcd(LLa,LLb){i......
  • 2321. 拼接数组的最大分数(leetcode)
    https://leetcode.cn/problems/maximum-score-of-spliced-array/description/这一题应该算一个连续最大子数组思维题,要点是根据差数组去做,然后求最值classSolution{public:intmaximumsSplicedArray(vector<int>&nums1,vector<int>&nums2){//f[i]表示以......
  • 洛谷题单指南-数学基础问题-P1069 [NOIP2009 普及组] 细胞分裂
    原题链接:https://www.luogu.com.cn/problem/P1069题意解读:一个数s代表细胞经过一天分裂的个数,则经过t天后个数为st,要计算经过几天后能整除m1m2,也就是st%m1m2==0,有多个s,要计算天数最少就可以满足条件的。解题思路:直接求st%m1m2显然不可取,会超出整数最大范围,高精度也不是好......
  • 洛谷题单指南-数学基础问题-P1072 [NOIP2009 提高组] Hankson 的趣味题
    原题链接:https://www.luogu.com.cn/problem/P1072题意解读:求有多少个x,满足x和a0​的最大公约数是a1​,x和b0​的最小公倍数是b1,多组数据。解题思路:枚举法:因为x和a0​的最大公约数是a1​,x和b0​的最小公倍数是b1,所以x不大于b1​。枚举x有两种思路:1、x是a1的倍数,最多需要枚举......
  • 洛谷题单指南-数学基础问题-P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    原题链接:https://www.luogu.com.cn/problem/P1029题意解读:已知x,y,求有多少对p、q,使得p、q的最大公约数为x,最小公倍数为y。解题思路:枚举法即可。枚举的对象:枚举p,且p必须是x的倍数,还有p<=yq的计算:q=x*y/p,q要存在,必须x*y%p==0,且gcd(p,q)==x100分代码:#include......
  • 洛谷题单指南-数学基础问题-P1835 素数密度
    原题链接:https://www.luogu.com.cn/problem/P1835题意解读:要计算L-R范围内素数的个数。解题思路:直接对L~R的每个数判断素数肯定不可取,因为L、R的范围较大。既然要计算素数的个数,那么可以把其中的合数标记出来即可。如何标记合数?可以借助于筛素数的算法思想,枚举每一个素数,然......
  • ChatGPT周岁记:亲手写下成绩单,它给自己打了这样的分数
    2022年11月30日,这一天或许会被镌刻进人类历史的转折点——源自美国的人工智能研发翘楚OpenAI推出了对话式AIChatGPT,该事件不仅在全球AI业界掀起了新一轮高潮,更为罕见地被比肩为继“蒸汽机时代”、“智能手机时代”甚至“火的发现”之后的重大里程碑。此年间,被冠以“生成式人......
  • 洛谷题单指南-数学基础问题-P3383 【模板】线性筛素数
    原题链接:https://www.luogu.com.cn/problem/P3383题意解读:素数筛模版题。解题思路:素数筛介绍所谓素数(质数),是指除了1和它本身以外不再有其他因数的自然数,一般用试除法判断素数(时间复杂度:O(sqrt(n))):boolisprime(intx){if(x<=1)returnfalse;for(inti=2;i*......
  • 洛谷题单指南-数学基础问题-P2926 [USACO08DEC] Patting Heads S
    原题链接:https://www.luogu.com.cn/problem/P2926题意解读:有n个数,计算每个数能整除其他数的个数。解题思路:a[100005]记录所有的数,h[1000005]记录所有数的个数,cnt[1000005]记录所有数能整除其他数的个数只需要读入a数组,同时更新h[a[i]]++再依次从小到大遍历h的下标每一个数i,如......
  • 洛谷题单指南-数学基础问题-P2638 安全系统
    原题链接:https://www.luogu.com.cn/problem/P2638题意解读:把a个红球、b个黑球放入n个盒子,求所有的方法。解题思路:盒子中可以放也可以不放,可以放任意个,因此,题目可以转化为将i个红球(0<=i<=a),j个黑球(0<=j<=b)放入n个盒子的方案数之和,设f(n,i,j)表示将一个红球、j个黑球放入n......