测试都混过去了,就是觉得做的有点太水了。。。 不知道怎么进一步优化。 代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int gcd(int x, int y)
{
if (y == 0)
return x;
return gcd(y, x % y);
}
int main()
{
char s[110] = "\0";
int a = 0, b = 0;
int sgn[110] = { 0 };
int fz[110] = { 0 }, fm[110] = { 0 };
int z = 0, m = 1, z1 = 0;
scanf("%s", s);
if (s[0] >= '0' && s[0] <= '9')
{
sgn[0] = 1;
z1++;
}
for (int i = 0; s[i] != '\0'; i++)
{
if (s[i] >= '0' && s[i] <= '9')
if (m == 1)
a = a * 10 + s[i] - '0';
else
b = b * 10 + s[i] - '0';
else if (s[i] == '-')
{
sgn[z1] = -1;
z1++;
fz[z] += a;
fm[z] += b;
z++;
m = 1;
a = 0;
b = 0;
}
else if (s[i] == '+')
{
sgn[z1] = 1;
z1++;
fz[z] += a;
fm[z] += b;
z++;
m = 1;
a = 0;
b = 0;
}
else
{
m = 0;
}
}
fz[z] = a;
fm[z] = b;
/*
for (int i = 0; fz[i]; i++)
printf("%d ", fz[i]);
printf("\n");
for (int i = 0; fm[i]; i++)
printf("%d ", fm[i]);
*/
/*
int x, y;
scanf("%d%d", &x, &y);
printf("%d", gcd(x, y));
*/
int bei;
bei = fm[0];
for (int i = 0; fm[i + 1]; i++)
{
if (bei % fm[i + 1] != 0)
bei = bei * fm[i + 1] / gcd(bei, fm[i + 1]);
else
continue;
}
int fenzi = 0;
for (int i = 0; fm[i]; i++)
{
fz[i] *= (bei / fm[i]);
fenzi += fz[i] * sgn[i];
}
z = gcd(fenzi, bei);
if (z < 0)
z *= -1;
fenzi /= z;
bei /= z;
if (bei != 1)
printf("%d/%d", fenzi, bei);
else
printf("%d", fenzi);
return 0;
}