给出了几个正分数,用空格隔开。计算分数之和(将结果减去最大公约数)
该程序给出了分段错误。错误在哪里?
#include <stdio.h>
#include <stdlib.h>
int gcd (int a, int b) {
if (a == b) {
return a;
else if (a > b) {
int tmp;
a = b;
b = tmp;
}
return gcd(a, b - a);
}
int main () {
int a, b, sum = 0, pro = 1, n, *num = NULL, *den = NULL, j, tmp;
scanf ("%d\n", &n);
num = malloc(n * sizeof(int));
den = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf ("%d/%d\n", &num[i], &den[i]);
}
for (int i = 0; i < n; i++) {
pro *= den[i];
for ((j = 0 && j != i); j < n; j++)
tmp = num[i] * den[j];
sum += tmp;
}
if (gcd (sum, pro) != 1) {
sum %= gcd(sum, pro);
pro %= gcd(sum, pro);
}
printf ("%d/%d", sum, pro);
free(num);
free(den);
}
您的代码根本无法编译。如果您更正明显的错误 - 正如您已经被告知的那样,存在未初始化的变量。您处理分数的方式仅适用于非常小的分子和分母值,因为它很快会导致溢出。
我会这样做,没有任何数组。
long long只是为了安全起见,以防您的分数在相乘时溢出。“保护傻瓜”是最简单的,通过assert.工作示例。您可以亲眼看到价值增长的速度有多快......
以一种好的方式,还需要减少输入分数以防万一: