2 int GCD(int x,int y); 3 int LCM(int x,int y); 4 int main() 5 {6 int n,x,y,i,a=0,b=0,m,t,k,f=0; 7 scanf(\"%d\\n\",&n); 8 for(i=1;i<=n;i++) 9 {
10 x=a;//储存两个有理分数其中⼀个分⼦11 y=b;//储存x的分母
12 scanf(\"%d/%d\",&a,&b);//输⼊两个整数,前者是分⼦,后者是分母13 if(i==1)14 {
15 continue;//第⼀次x,y没有存储到我们输⼊的值,所以不能执⾏下⾯的代码16 }
17 t=LCM(b,y);//求出两个有理分数中分母的最⼩公倍数(LCM)来进⾏分⼦的求和运算18 a=(t/b)*a+(t/y)*x;//两个有理分数求和后的⼀个新的有理分数的分⼦19 b=t;//新有理分数中的分母// 20 }
21 if(a>=b)//如果分⼦不⼩于分母,则则可以分离出⼀个整数部分k22 {
23 k=a/b;
24 printf(\"%d\",k);
25 a=a-k*b;//此时的a为有理化后的分数部分的分⼦26 f=1;//作为a经过⼀次有理化之后的标志 27 }
28 if(a==0&&f==1)29 {
30 //如果a为0且f为1,则说明该有理分数求和时只得出了整数且该整数不为031 }
32 else if(a==0&&f==0)33 {
34 printf(\"0\");//如果a为0且f为0,则说明有理分数求和时只得出了整数且该整数为0 35 }
36 else /*除了上述两个条件之外,⽆论是求和结果得出了整数和有理分数还是只得出了有理分数,
37 总之存在⼀个有理分数a/b(若f为1,则a是求和后分离出整数之后的新分⼦但我们为了简便还⽤a表⽰;38 若f为0,则a就是求和之后的分⼦)*/ 39 {
40 m=GCD(a,b);
41 a/=m;42 b/=m;
43 printf(\"%d/%d\\n\",a,b);44 }
45 return 0;46 }
47 int GCD(int x,int y)48 {
49 int c;50 c=x%y;
51 while(c!=0) 52 {
53 x=y;54 y=c;55 c=x%y;56 }
57 return y;58 }
59 int LCM(int x,int y)60 {
61 int temp, i;62 if(x temp = x;65 x= y;66 y = temp;67 }
68 for(i=x; i>0; i++)
69 if(i%x==0&&i%y==0)70 {
71 return i;72 break;73 }74 }
出现的问题
经过运⾏之后我们发现输出结果与⽰例的结果均⼀致,但我们提交到做题系统后,却只得了⼀半的分。(出现的问题)
解决⽅案
这是我们才发现系统判错很公道,我们忘记了随时化简可能导致了数据溢出,⽽且我们忽略了输出负整数和整数的情况。通过进⼀步学习与调整,我们得出这套代码:
1 1 #include 2 2 #include3 3 long int my(long int a,long int b);
4 4 void simplify(long int *up,long int *down,long int ); 5 5 int main() 6 6 {
7 7 int N;
8 8 scanf(\"%d\",&N);
9 9 long int up[N],down[N];
10 10 for(int i=0;i12 12 scanf(\"%ld/%ld\",&up[i],&down[i]);13 13 }14 14 long int ;
15 15 long int up1 = up[0];
16 16 long int down1 = down[0];
17 17 simplify(&up1, &down1, my(up1,down1));18 18 for(int i=1; i20 20 if(up1!=0) //前i-1项和不为0时 21 21 {22 22 long int temp;
23 23 simplify(&up1, &down1, my(up1,down1)); //对前i-1项和进⾏化简
24 24 = my(down1,down[i]); //求前i-1项和的分母与第i项分母的最⼤公约数 25 25 temp = down1;
26 26 down1 = down1*down[i]/; //求前i-1项和的分母与第i项分母的最⼩公倍数27 27 up1 *= down1/temp; //分⼦分母同时放⼤ 28 28 up[i] *= down1/down[i];29 29 up1 += up[i];30 30 }
31 31 else //前i-1项和为0 32 32 {
33 33 down1 = down[i];34 34 up1 = up[i];35 35 }36 36 }
37 37 simplify(&up1, &down1, my(up1,down1)); //对最后⼀次计算结果进⾏化简38 38 if(up1==0) //打印结果 39 39 {
40 40 printf(\"0\");41 41 }
42 42 else if(up1/down1==0)43 43 {
44 44 printf(\"%ld/%ld\",up1,down1);45 45 }
46 46 else if(up1%down1==0)47 47 {
48 48 printf(\"%ld\",up1/down1);49 49 }50 50 else51 51 {
52 52 printf(\"%ld %ld/%ld\",up1/down1,up1%down1,down1);53 53 }
54 54 return 0;55 55 }56 56
57 57 long int my(long int a,long int b) //计算最⼤公约数 58 58 {
59 59 a = fabs(a); //考虑a为负数 60 60 long int r;61 61 do62 62 {
63 63 r = a%b; a = b;65 65 b = r;66 66 }while(r!=0);67 67 return a;68 68 }69 69
70 70 void simplify(long int *up,long int *down,long int ) //分数化简 71 71 {
72 72 *up /= ;73 73 *down /= ;74 74 }75
⽂末
感谢⼤家观看本⽂,也希望⼤佬们多多指点。 2021-05-1701:05:28