PAT-L1-009. N个数求和

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
	}
}
 

猜你喜欢

转载自blog.csdn.net/u011987219/article/details/77335264