五一七教育网
您的当前位置:首页关于N个有理分数求和的分析(c语言)

关于N个有理分数求和的分析(c语言)

来源:五一七教育网
关于N个有理分数求和的分析(c语⾔)

题⽬要求

本题的要求很简单,就是求N个数字的和。⿇烦的是,这些数字是以有理数分⼦/分母的形式给出的,你输出的和也必须是有理数的形式。输⼊格式:

输⼊第⼀⾏给出⼀个正整数N(≤100)。随后⼀⾏按格式a1/b1 a2/b2 ...给出N个有理数。题⽬保证所有分⼦和分母都在长整型范围内。另外,负数的符号⼀定出现在分⼦前⾯。输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分⼦/分母,要求分⼦⼩于分母,且它们没有公因⼦。如果结果的整数部分为0,则只输出分数部分。

输⼊样例1:5

2/5 4/15 1/30 -2/60 8/3输出样例1:3 1/3

输⼊样例2:2

4/3 2/3

输出样例2:2

输⼊样例3:3

1/3 -1/6 1/8

输出样例3:7/24

编写⽰例

下⾯让我们看⼀段c语⾔代码(⽆数组):

1 #include 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 #include

3 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

因篇幅问题不能全部显示,请点此查看更多更全内容