L1-009 N个数求和
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例:
5
2/5 4/15 1/30 -2/60 8/3
输出样例:
3 1/3
C语言参考代码:
#include <stdio.h>
int Roll_Div(long long x, long long y) {
int temp = 0;
while (temp=x%y){
x = y;
y = temp;
}
return y;
}
int main() {
int n,i;
scanf("%d", &n);
long long a, b;
long long suma=0,sumb=0;
for ( i = 0; i < n; i++){
scanf("%lld/%lld", &a, &b);//a:分子 b:分母
if (suma == 0 &&sumb==0) {
suma = a;
sumb = b;
}
else {
suma = suma * b + sumb * a;
sumb =sumb* b;
}
int com_fac=Roll_Div(suma, sumb);
sumb /= com_fac;
suma /= com_fac;
}
if (suma!=0 && (suma / sumb == 0))//只有分子部分
printf("%lld/%lld\n", suma, sumb);
else if (suma % sumb == 0)//只有整数部分
printf("%lld\n", suma / sumb);
else//有分数也有整数
printf("%lld %lld/%lld\n", suma / sumb, suma%sumb, sumb);
return 0;
}
C++参考代码:
#include<bits/stdc++.h>
using namespace std;
int gys(long long int a,long long int b){
int r;
if(b==0)return a;
else {
r=a%b;
return gys(b,r);
}
}
int main(){
long long int n,a,b,i,x=0,y=1,z;
cin>>n;
for(i=1;i<=n;i++){
scanf("%lld/%lld",&a,&b);
x=x*b+a*y;
y=y*b;
z=gys(x,y);
x/=z;
y/=z;
}
if(x==0){
cout<<0;
}
else{
if(x/y!=0&&x%y==0)cout<<x/y;
if(x/y!=0&&x%y!=0)cout<<x/y<<" "<<x%y<<"/"<<y;
if(x/y==0)cout<<x<<"/"<<y;
}
return 0;
}
Python参考代码:
import fractions#分数运算包
n = int(input())
f_list = input().split()
Sum = fractions.Fraction("0")
for i in range(n):
f = fractions.Fraction(f_list[i])
Sum += f
#化成最简分数
numerator = Sum.numerator#得到和的分子
denominator = Sum.denominator#得到和的分母
if numerator / denominator > 1:
z = numerator // denominator
newSum = Sum - z
if newSum != 0:
print('{} {}'.format(z, newSum))
else:
print(z)
else:
print(Sum)
Golang参考代码:
package main
import "fmt"
func gys(a,b int)int{
if(b==0){
return a
}else{
return gys(b,a%b)
}
}
func main(){
var n,a,b,x,y,z int
x,y=0,1
fmt.Scanf("%d",&n)
for i:=1;i<=n;i++{
fmt.Scanf("%d/%d",&a,&b)
x=x*b+a*y
y=y*b
z=gys(x,y)
x=x/z
y=y/z
}
if x==0{
fmt.Printf("0")
}else{
if x%y==0 {
fmt.Printf("%d\n",x/y)
}else{
if x/y==0{
fmt.Printf("%d/%d",x,y)
}else{
fmt.Printf("%d %d/%d",x/y,x%y,y)
}
}
}
}