zoukankan      html  css  js  c++  java
  • L1-009 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


    思路:直接用两个数组分别存分子和分母后通分相加再化简,考虑到通分时数据可能会爆int,所以用long long,写的略微有点复杂......


     1 #include<stdio.h>
     2 #include<math.h>
     3  long long int find( long long int a,long long int b);//找两个数的最大公约数(最后化简用) 
     4  long long int find1(long long int a, long long int b);//找两个数的最小公倍数 
     5  long long int find2(long long int num[],long long int n);//找一个数组内所有数的最小公倍数
     6 int main()
     7 {
     8      long long int n,s,s1;//s表示约分整数部分 ,s1表示分式的分子分母的最大公约数 
     9     scanf("%lld",&n);
    10      long long int sumbei,sum1=0,sum2;//sum1表示分子 ,sum2表示整数部分外的分式部分的分子 
    11      long long int num1[n],num2[n];//num1存分子,num2存分母
    12     char e='/';
    13     for(long long int i=0;i<n;i++)
    14     {
    15         scanf("%lld%c%lld",&num1[i],&e,&num2[i]);
    16      } 
    17      sumbei=find2(num2,n);//找所有分母的最小公倍数
    18       for(long long int i=0;i<n;i++)
    19       {
    20           sum1=sum1+num1[i]*(sumbei/num2[i]);//通分求分子和(分母为sumbei) 
    21       }
    22       if(sum1%sumbei==0)
    23       printf("%lld",sum1/sumbei);
    24       else if(sum1/sumbei>0)
    25       {
    26           s=sum1/sumbei;
    27           sum2=sum1-s*sumbei;
    28           s1=find(sum2,sumbei);
    29         printf("%lld %lld%c%lld",s,sum2/s1,e,sumbei/s1);
    30       }
    31       else if(sum1/sumbei<=0)
    32       {
    33            s1=find(sum1,sumbei);
    34            printf("%lld%c%lld",sum1/s1,e,sumbei/s1);
    35       }
    36     return 0;
    37 }
    38 long long int find(long long int a,long long int b)
    39 {
    40      long long int c,yue;
    41     c=a%b;
    42     while(c!=0)
    43     {
    44         a=b;
    45         b=c;
    46         c=a%b;
    47     }
    48     yue=b;
    49     return yue;
    50  } 
    51 long long int find1(long long int a,long long int b)
    52 {
    53     long long int c,sum,bei;
    54     sum=a*b;
    55     c=a%b;
    56     while(c!=0)
    57     {
    58         a=b;
    59         b=c;
    60         c=a%b;
    61     }
    62     bei=sum/b;
    63     return bei;
    64 }
    65 long long int find2( long long int num[],long long int n)
    66 {
    67     long long int flag=num[0];
    68     for(long long int i=1;i<n;i++)
    69     {
    70         flag=find1(flag,num[i]);
    71     }
    72     return flag;
    73 }
    大佬见笑,,
  • 相关阅读:
    怎样把顶级控件加在另一个控件上?
    GML规范相关资源
    VB6.0的事件、回调函数等
    [转]使用ErrorProvider改善用户体验
    今日新增3D词汇
    [转]在用数据绑定的时候我为什么不能把焦点移出(Tab out)我的控件?(译)
    [翻译]Windows Phone 7 Application Controls
    转帖Windows Phone 7开发环境搭建
    利用SDF2.3获取Windows Mobile上的IP地址和MAC地址
    “2010 GCR MVP Open Day”之行
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/10292298.html
Copyright © 2011-2022 走看看