https://pintia.cn/problem-sets/994805046380707840/problems/994805133597065216
这个题卡在了第三组为啥呢?
求gcd的时候对0取余了,3%0是错误的。
错误代码:
#include <iostream>//利用gcd求得最小公倍数。即分母。
using namespace std;
int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a%b);
}
int zx(int a, int b)
{
return (a*b / gcd(a, b));
}
int main()
{
int m[110];
int z[110];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> m[i];
getchar();
cin >> z[i];
}
int a, b;
a = 1;
for (int i = 0; i < n; i++)
{
b = z[i];
a = zx(a, b);
}
int sum = 0;
for (int i = 0; i < n; i++)
{
int c = a / z[i];
sum += c * m[i];
}
if (sum == 0)
{
printf("0\n");
return 0;
}
if (sum < 0)
{
sum = sum * -1;
printf("-");
}
int d = gcd(sum, a);
sum = sum / d;
a = a / d;
if (sum < a) printf("%d/%d", sum, a);
else if (sum == a) printf("1");
else
{
printf("%d", sum/a);
if (sum%a != 0)
{
printf(" %d/%d", sum%a, a);
}
}
printf("\n");
return 0;
}
正确代码:
#include <iostream>//通分求分母。
using namespace std;
int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a%b);
}
int zx(int a, int b)
{
return (a*b / gcd(a, b));
}
int main()
{
int m[110];
int z[110];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> m[i];
getchar();
cin >> z[i];
}
int a, b;
a = 1;
for (int i = 0; i < n; i++)
{
b = z[i];
a = zx(a, b);
}
int sum = 0;
for (int i = 0; i < n; i++)
{
int c = a / z[i];
sum += c * m[i];
}
if (sum == 0)
{
printf("0\n");
return 0;
}
if (sum < 0)
{
sum = sum * -1;
printf("-");
}
int d = gcd(sum, a);
sum = sum / d;
a = a / d;
if (sum < a) printf("%d/%d", sum, a);
else if (sum == a) printf("1");
else
{
printf("%d", sum/a);
if (sum%a != 0)
{
printf(" %d/%d", sum%a, a);
}
}
printf("\n");
return 0;
}