打卡L1-009 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

思路如下:

首先确定思路,利用char类型数组s将数据接受,在分别用俩个数组将分子与分母的数存储起来

   char s[1000];
    long long int a,num=1,kum=0,jum=0,l=0,k=0,k1=0,r,kum1,num1;
    long long int fenzi[100000],fenmu[100000];
    memset(fenzi,0,sizeof(fenzi));
    memset(fenmu,0,sizeof(fenmu));

第二步:

将s中的数据转化成整数形存储在两个数组中,如果有负号将分子变成负数

    cin>>a;
    for(int x=0;x<a;x++)
    {
        cin>>s;
	        for(int y=strlen(s)-1;y>=0;y--)
	        {
	                if(s[y]=='/')
	                {
	                    l=1;
	                }
	                if(l==0&&s[y]!='/')
	                {
	                    fenmu[x]=fenmu[x]+(s[y]-'0')*pow(10,k);
	                        k++;
	                }
	                  
	                else if(l==1&&s[y]!='/'&&s[y]!='-')
	                {
	                    fenzi[x]=fenzi[x]+(s[y]-'0')*pow(10,k1);
	                    k1++;
	                }
	                
	        }
	        if(s[0]=='-')fenzi[x]=-fenzi[x];
	        l=0; k=0;k1=0;
     }

第三步:

利用数学规律将分子与分母通分,(所有分母相乘,每一个分子与非本分数的分母相乘)num存入通分后的分母,kum存入通分后相加的分子;此时的kum/num就是没化简的结果;

   for(int x1=0;x1<a;x1++)
   {
   	    num=fenmu[x1]*num;
   }
   for(int y1=0;y1<a;y1++)
   {
        jum=fenzi[y1];
	   	 for(int x1=0;x1<a;x1++)
	   	 {
	   	 	if(y1!=x1)
	   	 	{
			   jum=jum*fenmu[x1];
		    }
		   
         } 
	   kum=kum+jum;
   }   

最后

根据结果用最大公约数函数--gcd求化简后的结果,跟据要求输出答案;

    if(kum==0)
	    {
	        cout<<0<<endl;
	    }
	else
	{
	    kum1=kum/__gcd(kum,num);
       num1=num/__gcd(kum,num);
	   if(kum1>num1&&num1!=1) 
	   {
	   	 cout<<(kum1/num1)<<' '<<kum1-(kum/num)*num1<<'/'<<num1<<endl;
	   }
	   else
	   {
	
		        if(num1==1)
		        cout<<kum1<<endl;
		        else
		        cout<<kum1<<'/'<<num1<<endl;
	   }
    }
  return 0;

完整代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char s[1000];
    long long int a,num=1,kum=0,jum=0,l=0,k=0,k1=0,r,kum1,num1;
    long long int fenzi[100000],fenmu[100000];
    memset(fenzi,0,sizeof(fenzi));
    memset(fenmu,0,sizeof(fenmu));
    cin>>a;
    for(int x=0;x<a;x++)
    {
        cin>>s;
	        for(int y=strlen(s)-1;y>=0;y--)
	        {
	                if(s[y]=='/')
	                {
	                    l=1;
	                }
	                if(l==0&&s[y]!='/')
	                {
	                    fenmu[x]=fenmu[x]+(s[y]-'0')*pow(10,k);
	                        k++;
	                }
	                else if(l==1&&s[y]!='/'&&s[y]!='-')
	                {
	                    fenzi[x]=fenzi[x]+(s[y]-'0')*pow(10,k1);
	                    k1++;
	                }
	        }
	        if(s[0]=='-')fenzi[x]=-fenzi[x];
	        l=0; k=0;k1=0;
     }
   for(int x1=0;x1<a;x1++)
   {
   	    num=fenmu[x1]*num;
   }
   for(int y1=0;y1<a;y1++)
   {
        jum=fenzi[y1];
	   	 for(int x1=0;x1<a;x1++)
	   	 {
	   	 	if(y1!=x1)
	   	 	{
			   jum=jum*fenmu[x1];
		    }
		   
         } 
	   kum=kum+jum;
   }   
    if(kum==0)
	    {
	        cout<<0<<endl;
	    }
	else
	{
	    kum1=kum/__gcd(kum,num);
       num1=num/__gcd(kum,num);
	   if(kum1>num1&&num1!=1) 
	   {
	   	 cout<<(kum1/num1)<<' '<<kum1-(kum/num)*num1<<'/'<<num1<<endl;
	   }
	   else
	   {
	
		        if(num1==1)
		        cout<<kum1<<endl;
		        else
		        cout<<kum1<<'/'<<num1<<endl;
	   }
    }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值