PTA L1-009 N个数求和 C++实现

N个数求和

本题的要求很简单,就是求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

Talk is cheap. Show me the code.

#include
#include
#include

using namespace std;
struct fraction
{    
	long long fenzi=0;    
	char fenxian='/';    
	long long fenmu=1;
};
int main()
{    
	int n=0;    
	cin>>n;     
	if(n==0)    
	{        
		cout<<n;        
		return 0;     
	}     
	fraction f[n];    
	for(int i=0;i<n;i++)    
	{        
		cin>>f[i].fenzi>>f[i].fenxian>>f[i].fenmu;    
	}    
	long long lcm=f[0].fenmu;     
	for(int i=1;i<n;i++)    
	{        
		lcm=lcm*f[i].fenmu/__gcd(f[i].fenmu,lcm);    
	}    
	long long sum_fenzi=0;    
	for(int i=0;i<n;i++)    
	{        
		sum_fenzi=sum_fenzi+f[i].fenzi*(lcm/f[i].fenmu);    
	}    
	if(sum_fenzi/lcm==0)    
	{        
		if(sum_fenzi==0)        
		{            
			cout<<sum_fenzi/lcm;        
		}        
		else        
		{            
			cout<<sum_fenzi<<"/"<<lcm;        
		}    
	}    
	else    
	{        
		if(sum_fenzi%lcm==0)        
		{            
			cout<<sum_fenzi/lcm;        
		}        
		else        
		{            
			cout<<sum_fenzi/lcm<<" ";            
			if(__gcd(sum_fenzi,lcm)==1)            
			{                
				cout<<abs(sum_fenzi%lcm)<<"/"<<abs(lcm);            
			}            
			else            
			{                
				cout<<abs(sum_fenzi%lcm/__gcd(sum_fenzi,lcm))<<"/"<<abs(lcm/__gcd(sum_fenzi,lcm));    
			} 	
		} 
	}
}

解题思路

虽然这道题没有AC,但是还是写一下希望有位大佬可以提出错误,不甚感激。我的思路是从第一个输入的分母开始依次找出它和它的下一个的最小公倍数直到最后一个输入,然后分子×(分母/总的最小公倍数)再把这些分子求和,最后只用按照题目要求控制输出即可。输出有5种可能,1:输入N=0,直接输出0;2:输出最简分子/分母(整数为0);3输出整数 最简分子/分母;4:输出整数;5:输入出0;

我遇到的难点

1.

我以为分子为负数时还需要接收负号,但是我忘记了有符号整数类型是可以接受负号的,结果浪费了很多时间在输入上面。

分步代码解读

1.
 for(int i=1;i<n;i++)    
 {        
  	lcm=lcm*f[i].fenmu/__gcd(f[i].fenmu,lcm);    
 }    
 long long sum_fenzi=0;    
 for(int i=0;i<n;i++)    
 {        
  	sum_fenzi=sum_fenzi+f[i].fenzi*(lcm/f[i].fenmu);    
 }    

求分母的最小公倍数和和通分后的分子和。

2.
 if(sum_fenzi/lcm==0)    
 {        
  	if(sum_fenzi==0)        
  	{            
   		cout<<sum_fenzi/lcm;        
  	}        
  	else        
  	{            
   		cout<<sum_fenzi<<"/"<<lcm;        
  	}    
}    
else    
{        
	if(sum_fenzi%lcm==0)        
 	{            
   		cout<<sum_fenzi/lcm;        
  	}        
  	else        
  	{            
   		cout<<sum_fenzi/lcm<<" ";            
   		if(__gcd(sum_fenzi,lcm)==1)            
   		{                
    			cout<<abs(sum_fenzi%lcm)<<"/"<<abs(lcm);            
   		}            
   		else            
   		{                
    			cout<<abs(sum_fenzi%lcm/__gcd(sum_fenzi,lcm))<<"/"<<abs(lcm/__gcd(sum_fenzi,lcm));            
    		}        
   	}   
}  

控制输入不为0时的4种输出,有一点就是输出为整数 分子/分母这一种
时如果是负数,只用整数输出负数即可,例如:-1 1/2,但是如果不使用abs()函数,则会输出:-1 1/-2。但是PTA并没有这个测试点,所以不用也可。

测试结果

测试点3始终无法通过,如有大佬能够不吝赐教,我不甚感激。PTA L1-009 N个数求和 C++实现_第1张图片

补充

这道题要注意如果需要输出分子/分母形式的话,一定要是最简的,这也是测试点三未通过的原因

AC代码

#include
#include
#include

using namespace std;
struct fraction
{        
	long long fenzi=0;            
	long long fenmu=1;
};
int main()
{        
	int n=0;        
	cin>>n;         
	if(n==0)        
	{                
		cout<<n;                
		return 0;         
	}         
	fraction f[n];        
	for(int i=0;i<n;i++)        
	{           
		char temp;             
		cin>>f[i].fenzi>>temp>>f[i].fenmu;    
	}        
	long long lcm=f[0].fenmu;         
	for(int i=1;i<n;i++)        
	{                
		lcm=lcm*f[i].fenmu/__gcd(f[i].fenmu,lcm);        
	}        
	long long sum_fenzi=0;        
	for(int i=0;i<n;i++)        
	{                
		sum_fenzi=sum_fenzi+f[i].fenzi*(lcm/f[i].fenmu);        
	}        
	if(sum_fenzi/lcm==0)        
	{                
		if(sum_fenzi==0)                
		{                        
			cout<<sum_fenzi/lcm;                
		}                
		else                
		{                      
			if(__gcd(sum_fenzi,lcm)!=1)            
			{                
				cout<<sum_fenzi/__gcd(sum_fenzi,lcm)<<"/"<<lcm/__gcd(sum_fenzi,lcm);            
			}            
			else            
			{                
				cout<<sum_fenzi<<"/"<<lcm;            
			}                              
		}        
	}        
	else        
	{                
		if(sum_fenzi%lcm==0)                
		{                        
			cout<<sum_fenzi/lcm;                
		}                
		else                
		{                        
			cout<<sum_fenzi/lcm<<" ";                        
			if(__gcd(sum_fenzi,lcm)==1)                        
			{                                
				cout<<abs(sum_fenzi%lcm)<<"/"<<abs(lcm);                        
			}                        
			else                        
			{                                
				cout<<abs(sum_fenzi%lcm/__gcd(sum_fenzi,lcm))<<"/"<<abs(lcm/__gcd(sum_fenzi,lcm));                
			}           
		}     
	}
}

你可能感兴趣的:(PTA程序设计天梯赛练习,c++,程序人生,经验分享)