输入格式
输入一行,为一个分数计算式。
计算式中只包含数字、+
、-
、/
。其中 /
为分数线,分数线左边为分子,右边为分母。输入数据保证不会出现繁分数。如果输入计算式的第一项为正,不会有前缀 +
号;若为负,会有前缀 -
号。
所有整数均以分数形式出现。
输出格式
输出一行,为最后的计算结果(用最简分数或整数表示)。
保证答案内出现的所有数(如果答案是分数即为分子和分母)均在 64 位带符号整数的表示范围之内。
样例
样例输入 #1
样例输出 #1
样例输入 #2
| 1/2+1/3+1/4-1/4+1/5-1/5+6/1-6/1 |
样例输出 #2
样例输入 #3
| 7/4+1/3+8/5-3/2-6/9-6/4-5/2+6/2+4/9-3/9-2/3+5/2-5/4+3/9-3/8-5/8+6/8+3/8-4/7-5/7-3/6+6/9-5/6-5/7-5/2 |
样例输出 #3
样例输入 #4
样例输出 #4
提示
对于所有测试点,输入计算式长度在 100 以内,分子、分母在 1000 以内。
题解
思路
1.数据读取
2.通分累加
3.约分输出
C代码
| #include <stdio.h> |
| |
| |
| int greatest_common_divisor(int i, int j) { |
| int a = i, b = j; |
| if (a < b) { |
| int temp = a; |
| a = b; |
| b = temp; |
| } |
| int m = a * b; |
| int c = a % b; |
| while (c) { |
| a = b; |
| b = c; |
| c = a % b; |
| } |
| return b; |
| } |
| |
| |
| void add(int* a, int* b) { |
| int LCM = a[1] * b[1] / greatest_common_divisor(a[1], b[1]); |
| |
| a[0] = a[0] * LCM / a[1] + b[0] * LCM / b[1]; |
| a[1] = LCM; |
| } |
| |
| int main() { |
| int num[2]; |
| int ans[2]; |
| scanf("%d/%d", &ans[0], &ans[1]); |
| while (scanf("%d/%d", &num[0], &num[1]) != EOF) { |
| add(ans, (int*)(num)); |
| } |
| |
| |
| if(ans[0] == 0){ |
| printf("0"); |
| return 0; |
| } |
| |
| |
| int GCD = greatest_common_divisor(ans[0], ans[1]); |
| ans[0] /= GCD; |
| ans[1] /= GCD; |
| |
| |
| if (ans[1] < 0) { |
| ans[0] *= -1; |
| ans[1] *= -1; |
| } |
| |
| if (ans[1] != 1) |
| printf("%d/%d\n", ans[0], ans[1]); |
| else |
| printf("%d", ans[0]); |
| return 0; |
| } |
| |
| |
通过详情

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本