1. 程式人生 > 其它 >7-5 N個數求和 (20分)

7-5 N個數求和 (20分)

技術標籤:c語言c語言

7-5 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
#include<stdio.h>
void add(long *num1,long *den1,long *num2,long *den2)
{
    long den1_t=(*den1);//保留原來的den1的值,這種情況用指標方便
    *den1=(*den1)*(*den2);
    *num1=(*den2)*(*num1)+(den1_t)*(*num2);//上面中den1的值已經改變
}//兩個分子的相加
void simply(long
*num1,long *den1) { long i; for(i=2;i<*num1;i++) { //找到公約數 if(*num1%i==0&&*den1%i==0) { *num1=*num1/i; *den1=*den1/i; i=2; } } }//這種方法思路簡單,但是用時長。可以用輾轉相減法或輾轉相除法找出公因子,再兩兩相除 int main() { int N,i,flag=0; long num1,
den1,num2,den2,a; scanf("%d",&N); scanf("%ld/%ld",&num1,&den1); for(int i=0;i<N-1;i++) //輸入剩餘的N-1個值 { scanf("%ld/%ld",&num2,&den2); add(&num1,&den1,&num2,&den2); if(num1<0) { flag=1; num1=-(num1);//這樣分子就為正值,在化簡的時候就可以正常使用函式 } simply(&num1,&den1); if(flag) { num1=-num1; flag=0; } }//此時已經得到最終化簡的分式 a=num1/den1;//由題幹可知,a值是個正值 if(num1<0) { num1=-num1; flag=1; } num1=num1%den1; simply(&num1,&den1);//確保化簡完全 if(flag) { num1=-num1; }//還原 if(a)//存在整數部分 { if(num1==0) printf("%d",a);//結果只有整數部分 else printf("%d ",a);//注意結果嚴格控制空格 }//注意特殊情況以及細節 if(num1!=0) { printf("%d/%d",num1,den1); } if(num1==0&&a==0) printf("0\n"); }