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

原题链接: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;
}

 

posted @ 2024-04-15 14:03  五月江城  阅读(44)  评论(0编辑  收藏  举报