版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011987219/article/details/77335264
之前用java没跑出来,过了很久重新用python写了一遍跑出来了,原有的java的代码也没有删除,知道问题在哪里了,写在注意点里面
这道题目要考虑到细节
1.掌握求解最大公约数和最小公倍数的方法——辗转相除法
2.考虑最终的结果可能是负数的情况,应该先约分和变为整数和分数的情况后,再添加上符号
L1-009. N个数求和
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
扫描二维码关注公众号,回复:
4499662 查看本文章
作者
陈越
本题的要求很简单,就是求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
#求解最大公约数
def gys(m,n):
if (m<n):
m=m+n
n=m-n
m=m-n
c = m%n
while(c!=0):
m=n
n=c
c=m%n
return int(n)
#求解最小公倍数
def gbs(m,n):
return int(m*n/gys(m,n))
N = int(input())
line = input()
number = line.split()
fz=[]
fm=[]
for i in range(N):
fz.append(number[i].split('/')[0])
fm.append(number[i].split('/')[1])
zxgbs=1
for i in range(N):
zxgbs = gbs(zxgbs,int(fm[i]))
sum_fz=0
for i in range(N):
sum_fz=sum_fz+int(fz[i])*zxgbs/int(fm[i])
if sum_fz!=0:
zdgys=gys(abs(sum_fz),zxgbs)
sum_fz_jh=int(abs(sum_fz)/zdgys)
sum_fm_jh=int(zxgbs/zdgys)
zs=0
zs=int(sum_fz_jh/sum_fm_jh)
xs=int(sum_fz_jh%sum_fm_jh)
if sum_fz<0:
zs=zs*-1
xs=xs*-1
if zs == 0 and xs!=0:
print(str(xs)+'/'+str(sum_fm_jh))
elif zs == 0 and xs==0:
print('0')
elif zs!=0 and xs==0:
print(zs)
else:
print(str(zs)+' '+str(xs)+'/'+str(sum_fm_jh))
else:
print('0')
/*这个没跑出来*/
import java.util.Scanner;
public class Main{
public static long gys(long a,long b){
long temp;
while(b!=0){
temp=a%b;
a=b;
b=temp;
}
//System.out.println("zdGys:"+a);
return a;
}
public static long gbs(long a, long b ){
long zxGbs=1;
zxGbs=a*b/gys(a,b);
// System.out.println("zxGbs:"+zxGbs);
return zxGbs;
}
public static String findSum(String str1,String str2){
String value1[]=new String[2];
value1=str1.split("/");
long fz1=Long.parseLong(value1[0]);
long fm1=Long.parseLong(value1[1]);
String value2[]=new String[2];
value2=str2.split("/");
long fz2=Long.parseLong(value2[0]);
long fm2=Long.parseLong(value2[1]);
// System.out.println("fz1,fm1,fz2,fm2:"+fz1+" "+fm1+" "+fz2+" "+fm2);
long zxGbs=gbs(fm1,fm2);
long fzSum=zxGbs/fm1*fz1+ zxGbs/fm2*fz2;
long zdGys=gys(fzSum,zxGbs);
//System.out.println("zdGys:"+zdGys);
long fzRes=fzSum/zdGys;
long fmRes=zxGbs/zdGys;
String str=fzRes+"/"+fmRes;
return str;
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int inputNum=Integer.parseInt(sc.nextLine());
String finalRes;
if(inputNum<=1) finalRes=sc.nextLine();
else{
//sc.useDelimiter(" ");
String str1=sc.next();
String str2=sc.next();
finalRes=findSum(str1,str2);
//System.out.println(finalRes);
for(int i=2;i<inputNum;i++){
String str=sc.next();
finalRes=findSum(finalRes,str);
}
}
String[] value=new String [2];
value=finalRes.split("/");
long fzRes=Long.parseLong(value[0]);
long fmRes=Long.parseLong(value[1]);
long zs = (long)Math.floor(fzRes/fmRes);
long zdGys=gys(fzRes,fmRes);
fzRes=fzRes/zdGys;
fmRes=fmRes/zdGys;
fzRes = fzRes % fmRes;
if(fzRes >0 && fmRes <0){
fzRes*=-1;
fmRes*=-1;
}
if(zs<0) fzRes*=-1;
if(zs ==0 && fzRes!=0 ) System.out.println(fzRes+"/"+fmRes);
else if(zs !=0 && fzRes==0) System.out.println(zs);
else if(zs ==0 && fzRes==0) System.out.println("0");
else System.out.println(zs+" "+fzRes+"/"+fmRes);
}
}