后面的测试点过不去,两个错误一个超时。目前未解决
L1-009 N个数求和 (20 分)
本题的要求很简单,就是求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
1 #include<stdio.h> 2 int main(){ 3 int x; 4 int y[100][2]; 5 int sum1=0;//整数 6 int sum2[2];//分数 7 char c; 8 scanf("%d",&x); 9 // printf("个数%d\n",x); 10 int i=0; 11 for(i=0;i<x;i++){ 12 13 scanf("%d",&y[i][0]); 14 15 c=getchar(); 16 if(c=='/') 17 scanf("%d",&y[i][1]); 18 else y[i][1]=1; 19 // printf("接收%d/%d\n",y[i][0],y[i][1]); 20 } 21 sum2[0]=y[0][0]; 22 sum2[1]=y[0][1]; 23 int z=1; 24 for(z=1;z<x;z++){//计算相加 25 //printf("个数%d\n",x); 26 //printf("y1 %d y2 %d\n",y[z][0],y[z][1]); 27 //1.加 28 sum2[0]=sum2[0]*y[z][1]+y[z][0]*sum2[1]; 29 sum2[1]=sum2[1]*y[z][1]; 30 // printf("jia后%d /%d\n",sum2[0],sum2[1]); 31 //2.有理化 32 while(sum2[0]>=sum2[1]){ 33 sum2[0]-=sum2[1]; 34 sum1++; 35 //printf("有理化后%d /%d\n",sum2[0],sum2[1]); 36 if(sum2[0]==0){ 37 sum2[1]==0; 38 break; 39 } 40 } 41 //3. 约分 42 if(sum2[1]!=0){ 43 int n; 44 for(n=1;n<=sum2[0];n++){ 45 if(sum2[0]%n==0&&sum2[1]%n==0){ 46 sum2[0]/=n; 47 sum2[1]/=n; 48 // printf("约束%d\n",n); 49 } 50 // printf("约分后%d /%d\n",sum2[0],sum2[1]); 51 } 52 } 53 54 } 55 //输出结果 56 if(sum1!=0){ 57 printf("%d",sum1); 58 if(sum2[0]!=0){ 59 printf(" "); 60 } 61 } 62 if(sum2[0]!=0){ 63 printf("%d/%d",sum2[0],sum2[1]); 64 } 65 66 return 0; 67 }