本题的要求很简单,就是求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思路:直接用两个数组分别存分子和分母后通分相加再化简,考虑到通分时数据可能会爆int,所以用long long,写的略微有点复杂......
1 #include<stdio.h> 2 #include<math.h> 3 long long int find( long long int a,long long int b);//找两个数的最大公约数(最后化简用) 4 long long int find1(long long int a, long long int b);//找两个数的最小公倍数 5 long long int find2(long long int num[],long long int n);//找一个数组内所有数的最小公倍数 6 int main() 7 { 8 long long int n,s,s1;//s表示约分整数部分 ,s1表示分式的分子分母的最大公约数 9 scanf("%lld",&n); 10 long long int sumbei,sum1=0,sum2;//sum1表示分子 ,sum2表示整数部分外的分式部分的分子 11 long long int num1[n],num2[n];//num1存分子,num2存分母 12 char e='/'; 13 for(long long int i=0;i<n;i++) 14 { 15 scanf("%lld%c%lld",&num1[i],&e,&num2[i]); 16 } 17 sumbei=find2(num2,n);//找所有分母的最小公倍数 18 for(long long int i=0;i<n;i++) 19 { 20 sum1=sum1+num1[i]*(sumbei/num2[i]);//通分求分子和(分母为sumbei) 21 } 22 if(sum1%sumbei==0) 23 printf("%lld",sum1/sumbei); 24 else if(sum1/sumbei>0) 25 { 26 s=sum1/sumbei; 27 sum2=sum1-s*sumbei; 28 s1=find(sum2,sumbei); 29 printf("%lld %lld%c%lld",s,sum2/s1,e,sumbei/s1); 30 } 31 else if(sum1/sumbei<=0) 32 { 33 s1=find(sum1,sumbei); 34 printf("%lld%c%lld",sum1/s1,e,sumbei/s1); 35 } 36 return 0; 37 } 38 long long int find(long long int a,long long int b) 39 { 40 long long int c,yue; 41 c=a%b; 42 while(c!=0) 43 { 44 a=b; 45 b=c; 46 c=a%b; 47 } 48 yue=b; 49 return yue; 50 } 51 long long int find1(long long int a,long long int b) 52 { 53 long long int c,sum,bei; 54 sum=a*b; 55 c=a%b; 56 while(c!=0) 57 { 58 a=b; 59 b=c; 60 c=a%b; 61 } 62 bei=sum/b; 63 return bei; 64 } 65 long long int find2( long long int num[],long long int n) 66 { 67 long long int flag=num[0]; 68 for(long long int i=1;i<n;i++) 69 { 70 flag=find1(flag,num[i]); 71 } 72 return flag; 73 }
来源:https://www.cnblogs.com/xwl3109377858/p/10292298.html