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

第二部分:思路

分数加法简单,不予解释。这里需要注意几点:

1,答案错误:整数部分和分数部分一定是同号的,即同正同负。比如:2/3 -7/3,结果应该是-1 -2/3。一开始没注意到这点,输出的会是-2 1/3.

输出:整数为0看分数,如果分数也为0那么输出0.

2,浮点错误:这里多半是因为长度超出,这里需要在每次求和后就把分数部分变成最简形式,就是分子小于分母,且它们没有公因子。

第三部分:代码

#include<stdio.h>
#include<stdlib.h>
long long fun(long long m,long long n)
{
    //求最大公约数
    long long r=n%m;
    while(r!=0)
    {
        n=m;
        m=r;
        r=n%m;
    }
    return m;
}
int main()
{
    int n;
    scanf("%d",&n);
    long long x,y,sum=0;
    int i;
    for(i=0;i<n;i++)
    {
        long long a,b;
        char ch;
        scanf("%lld%c%lld",&a,&ch,&b);
        sum+=a/b;
        a%=b;
        if(i==0)
        {
            x=a;
            y=b;
        }
        else
        {
            sum+=(a*y+x*b)/(y*b);
            x=(a*y+x*b)%(y*b);
            y*=b;
        }
        if(sum*x<0)
        {
            if(sum>0)
            {
                sum--;
                x+=y;
            }
            else
            {
                sum++;
                x-=y;
            }
        }
        if(x!=0&&y!=0)
        {
            long long t=x;
            if(t<0)
            {
                t*=-1;
            }
            t=fun(t,y);
            x/=t;
            y/=t;
        }
    }
    if(sum!=0)
    {
        printf("%lld",sum);
        if(x!=0&&y!=0)
        {
            printf(" %lld/%lld\n",x,y);
        }
    }
    else
    {
        if(x!=0&&y!=0)
        {
            printf("%lld/%lld\n",x,y);
        }
        else
        {
            printf("%d\n",0);
        }
    }
    return 0;
}
时间: 2024-10-18 22:35:39

L1-009. N个数求和的相关文章

0066-若干个数求和问题

若干个数求和问题 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 输入若干个整数(不会超过 10000 个),输出它们的和. 输入 一行包括若干个整数(绝对值不超过100),两两之间用一个空格分隔. 输出 一个数,表示输入所有数的和(结果在 int 范围内). 输入示例 3 2 4 1 5 6 输出示例 21 这题乍一看没毛病,但……不给项数怎么行?!当然行.只是你需要这样一句话: cin.get()=='\n' 意思是:读

N个数求和(PTA)

7-1 N个数求和 (20 分) 本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(≤100).随后一行按格式a1/b1 a2/b2 ...给出N个有理数.题目保证所有分子和分母都在长整型范围内.另外,负数的符号一定出现在分子前面. 输出格式: 输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子.如果结果的整

Java:多个数求和

设计思想: 先定义int n,定义输入数的个数,输入一个新建的动态数组,输入数字存入动态数组中,函数转换并求和,最后输出. 程序流程图: 源程序代码: package com; import java.util.Scanner; public class Addadd { public static void main(String[] args){ Scanner scan = new Scanner(System.in);//创建Scanner的类对象 int n; System.out.p

ARM中C和汇编的相互调用(5个数求和、字符串拷贝)

开发环境:Keil5 工程目录:   一.汇编调用C——多数相加 使用汇编调用C,需要注意的是参数的传递.不同于X86的传参规则,在ARM体系中,如果形参的个数不超过4个,使用特殊寄存去R0~R3传递:而如果参数大于4个,就要将多出来的那部分参数使用堆栈传递. 压栈的之后移动位置指针,压栈顺序别忘了是最后一个参数先入栈->倒数第二个参数->,,,, 下面的代码实现了五个参数求和,首先使R0=0,R1=1,R2=2,R3=3,第五个参数使用栈传递,并移动堆栈指针. (1)startup.s St

zzuli OJ 1081: n个数求和 (多实例测试)

Description 求n个整数的和. Input 输入第一行是一个整数T,表示有T组测试实例: 每组输入包括两行: 第一行一个数n表示接下来会有n个整数: 第二行空格隔开的n个数. Output 对于每组输入,在一行输出n个数的和(保证和不会超出int类型的范围)! Sample Input 231 2 34-1 0 -19 22 Sample Output 62 HINT Source #include<stdio.h> int main() { int t,a[14],b,c,j,i,

Shell 脚本《两个数求和》

#!/bin/bash #read -r使\取消转义功能 -p提示内容 read -r -p "Please input A: " A read -r -p "Then please input B: " B #$(( )) 比let更好, 注意 $(( )) 里面的变量不用$ sum=$(( A+B )) #printf 默认不会带回车行,echo则不一样 printf "A+B=%d" $sum 原文地址:http://blog.51cto.

java从命令行接收多个数字,求和之后输出结果

设计思想:获取输入数的个数,然后将要相加的数字转换成为浮点型进行相加,最后进行输出 流程图 :   开始-->输入n个数-->求和-->输出结果-->结束: 源代码: //王浩  2015/9/26 package add; import java.util.Scanner; public class Add { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n

Java多个数相加源代码流程图设计思想

一.设计思想: 1.理解题目要求,即  编写程序完成多个数字相加并输出结果,题目中的难点就是命令行的参数为字符串,需要经过转化变为数字后进行计算,通过查询互联网得到解决问题方法,用“*.nextInt()”函数即可解决此问题. 2.设计程序的结构,先申请动态空间,完成可输入多个数字的要求. 最后通过输入.计算.输出完成程序. 二.程序流程图 三.源代码 package sum; import java.util.Scanner; public class Text { public static

Sicily Online Judge 1438. Shopaholic (快排,隔三求和)

1438. Shopaholic Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Lindsay is a shopaholic. Whenever there is a discount of the kind where you can buy three items and only pay for two, she goes completely mad and feels a need to buy all