7-5 N個數求和 (20分)
阿新 • • 發佈:2021-01-20
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");
}