周练1

7-1 N个数求和

写了蛮久 我做水题的能力太差了  明天得把周练题目全部a了 

还是有一个超时

#include <bits/stdc++.h>

using namespace std;


long gvs(long a,long b);
int main()
{

    int n;cin>>n;

    long a[105][2];
    for(int i=1;i<=n;i++)
     {
         scanf("%ld/%ld",&a[i][0],&a[i][1]);//printf("1:%d/%d\n",a[i][0],a[i][1]);
     }

     for(int i=1;i<=n-1;i++)
     {
         int g=gvs(a[i][1],a[i+1][1]);
        //  printf("g=%d\n",g);

         a[i+1][0]=a[i+1][0]*(g/a[i+1][1]); //printf("%d\n",a[i+1][0]);
         a[i][0]=a[i][0]*(g/a[i][1]); //printf("%d\n",a[i][0]);
         a[i+1][0]+=a[i][0];//printf("%d\n",a[i+1][0]);
         a[i+1][1]=g;//printf("%d\n",a[i+1][1]);

     }



//printf("%d/%d\n\n",a[n][0],a[n][1]);
int f=0;
if(a[n][0]<0){f=1;printf("-");a[n][0]=-a[n][0];}
if(a[n][0]==0)printf("0");
 long num=a[n][0]/a[n][1];
 a[n][0]%=a[n][1];
  if(num!=0&&a[n][0]!=0) printf("%d ",num);
  else if(num!=0)printf("%d",num);
 if(a[n][0]!=0)
 {
     for(int i=a[n][0];i>0;i--)
     {
         if(a[n][0]%i==0&&a[n][1]%i==0){if(f)printf("-"); printf("%ld/%ld",a[n][0]/i,a[n][1]/i); break;}
     }



 }








    return 0;

}

long gvs(long a,long b)
{
    if(a>b){int t=a;a=b;b=t;}

    for(long i=a;;i+=a)
    {
        if(i%a==0&&i%b==0)return i;

    }



}
View Code

看了别人的  最大公约数辗转相除  快了很多

并且边读边处理更加好

#include <stdio.h>
 
long long gcd(long long a,long long b)//求最大公约数。
{
    if(a == 0)
        return 0;
    else
        return (b == 0) ? a : gcd(b, a % b);
}
 
int main()
{
    int N;
    long long lcp;//用以记录最小公倍数
    long long a,b,c,d;
    int i = 1;
    scanf("%d",&N);
    scanf("%lld/%lld",&a,&b);
    int t0 = gcd(a,b);
    if(a)
    {
        a /= t0;
        b /= t0;
    }
 
    while(i < N)
    {
        scanf("%lld/%lld",&c,&d);
        lcp = b / gcd(b,d) * d;//通过最大公约数换算出两个分母的最小公倍数
        a = a * lcp / b + c * lcp / d;//通分后分子和
        b = lcp;
        int t0 = gcd(a,b);
        if(t0 != 0)//从扩大最小公倍数之后的形式变换回来
        {
            a = a / t0;
            b = b / t0;
        }
        i++;
    }
    if(a && a/b == 0)/// 整数部分为0 且 a不为 0
        printf("%lld/%lld\n",a%b,b);
    else if(a%b == 0)/// 小数部分为0
        printf("%lld\n",a/b);
    else
        printf("%lld %lld/%lld\n",a/b,a%b,b);
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10177142.html
今日推荐