C语言分数加法计算器如何同时输出分数与小数结果?
解决方案
核心问题与修改要点
- 数据类型不合理:原代码用
double存储分子分母,分数运算本质是整数运算,改用int可避免精度丢失问题。 - 输入逻辑bug:
scanf("%s", &op)会读取多余空白字符,改为scanf(" %c", &op)(前置空格跳过换行符等空白)才能正确获取运算符。 - 分数计算逻辑缺失:原代码直接输出小数,未按分数加法规则计算通分后的分子分母,也没有约分得到最简分数。
- 格式串不匹配:原printf的格式符
%.lf/%.lf对应两个参数,但只传入了一个小数结果,导致输出混乱。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <stdlib.h> // 用于abs函数 // 辗转相除法求最大公约数,用于分数约分 int gcd(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a; } int main(void) { system("chcp 1252 > nul"); // 改用int类型存储分子分母 int z1, n1, z2, n2; char op; printf("Eingabe der ersten rationalen Zahl\n"); printf("Zähler 1:"); scanf("%d", &z1); printf("Nenner 1:"); scanf("%d", &n1); printf("Eingabe des Operators +, -, *, /:\n"); // 修正运算符输入逻辑 scanf(" %c", &op); printf("Eingabe der zweiten rationalen Zahl\n"); printf("Zähler 2:"); scanf("%d", &z2); printf("Nenner 2:"); scanf("%d", &n2); if (op == '+') { printf("Summe aus Bruch 1 und Bruch 2:\n"); // 按分数加法规则计算通分后的分子分母 int result_num = z1 * n2 + z2 * n1; int result_den = n1 * n2; // 约分得到最简分数 int common_divisor = gcd(abs(result_num), abs(result_den)); int simplified_num = result_num / common_divisor; int simplified_den = result_den / common_divisor; // 同时输出最简分数和小数形式 printf("%d/%d + %d/%d = %d/%d (%.2f)\n", z1, n1, z2, n2, simplified_num, simplified_den, (double)simplified_num / simplified_den); } return 0; }
关键修改说明
- 约分逻辑:通过辗转相除法计算最大公约数,将通分后的分子分母化简为最简形式,避免输出如
3/2变成6/4这类冗余分数。 - 分数运算规则:严格遵循
a/b + c/d = (a*d + c*b)/(b*d)的分数加法公式计算结果。 - 双格式输出:先输出约分后的最简分数,再通过强制类型转换将整数分子分母转为浮点型,得到精确的小数结果并保留两位小数。
内容的提问来源于stack exchange,提问作者Edi
相关产品推荐
相关产品推荐

