#020PAT 没整明白的题L1-009 N个数求和 (20 分)

后面的测试点过不去,两个错误一个超时。
目前未解决
 
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 }
 

猜你喜欢

转载自www.cnblogs.com/hx97/p/10625463.html