1. 程式人生 > >L1-009. N個數求和

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
  首先,我們將最後的結果設為x/y,在最開始,把x設為0,y設定為1。依次和輸入的資料進行相加。 每次加完以後檢查x和y是否可以約分,如果可以,就約分,不然會溢位。 題目測試資料還是不夠強,例如: 資料1:1/-5   (應該輸出-1/5) 資料2:-5 -2/3 (應該輸出-5 2/3) 這兩種情況題目中並沒有進行測試。 這裡給出了對資料1和2進行約束的程式。(旁邊有*的程式碼。)
#include <cstdio>
#include <cstdlib>
#define LL long long
using namespace std;

LL getGcd(LL a, LL b) {
    return b == 0 ? a : getGcd(b, a % b);
}
LL getLcm(LL a, LL b) {
    return a * b / getGcd(a, b);
}
LL n, a, b, x, y;

int main () {

    scanf("%lld", &n); 
    x = 0; y = 1;

    for (int i = 0; i < n; i++) {
        scanf("%lld/%lld", &a, &b);
        int lcm = getLcm(y, b);
        x = x * (lcm / y) + a * (lcm / b);
        y = lcm;
        int gcd = getGcd(x, y);
        x /= gcd; // 相加完成後能約分就約分 避免超出範圍
        y /= gcd;
    }
    LL integer = x / y;
    x %= y;

/**/if (y < 0 && x > 0) {
/**/    y *= -1;
/**/    x *= -1;
/**/}
/**/if (y < 0 && x < 0) {
/**/    x *= -1;
/**/    y *= -1;
/**/}
    
    if (integer == 0) {
        if (x == 0) {
            printf("0\n");
        } else {
            int gcd = getGcd(x, y);
            printf("%lld/%lld\n", x / gcd, y / gcd);
        }
    } else {
        if (x == 0) {
            printf("%lld\n", integer);
        } else {
        /**/if (integer < 0) {
        /**/    int gcd = getGcd(x, y);
        /**/    printf("%lld %lld/%lld\n", integer, abs(x / gcd), abs(y / gcd));            
            } else {
                int gcd = getGcd(x, y);
                printf("%lld %lld/%lld\n", integer, x / gcd, y / gcd);      
            }
            
        }
    }
    return 0;
}
   

檢視原文:http://iluhao.top/archives/744

相關推薦

2018/12/04 PAT刷題 L1-009 N個數求和 java

看了好久的程式碼, 終於看懂了: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in

L1-009. N個數求和-PAT團體程式設計天梯賽

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數“分子/分母”的形式給出的,你輸出的和也必須是有理數的形式。輸入格式:輸入第一行給出一個正整數N(<=100)。隨後一行按格式“a1/b1 a2/b2 ...”給出N個有理數。題目保證所有分子和分母都在長

L1-009. N個數求和

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數“分子/分母”的形式給出的,你輸出的和也必須是有理數的形式。 輸入格式: 輸入第一行給出一個正整數N(<=100)。隨後一行按格式“a1/b1 a2/b2 ...”給出N個有理數。題目保證所有分子和分

PAT L1-009. N個數求和 分數求和 struct過載

L1-009. N個數求和 時間限制 400 ms 記憶體限制 65536 kB 程式碼長度限制 8000 B 本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數“分子/分母”的形式給出的,你輸出的和也必須是有理數的形式。 輸入格

天梯賽習題 L1-009. N個數求和

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數“分子/分母”的形式給出的,你輸出的和也必須是有理數的形式。 輸入格式: 輸入第一行給出一個正整數N(<=100)。隨後一行按格式“a1/b1 a2/b2 ...”給出N個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數

團體程式設計天梯賽-練習集L1-009. *N個數求和

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數“分子/分母”的形式給出的,你輸出的和也必須是有理數的形式。 輸入格式: 輸入第一行給出一個正整數N(<=100)。隨後一行按格式“a1/b1 a2/b2 ...”給出N個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號

L1-009. N個數求和n個分數相加)

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數“分子/分母”的形式給出的,你輸出的和也必須是有理數的形式。 輸入格式: 輸入第一行給出一個正整數N(<=100)。隨後一

L1-009. N個數求和-PAT團體程式設計天梯賽GPLT

L1-009. N個數求和 輸入格式: 輸入第一行給出一個正整數N(<=100)。隨後一行按格式“a1/b1 a2/b2 ...”給出N個有理數。題目保證所有分子和分母都在長整型範圍內。另

L1-009 N個數求和

一行 turn main -h pro scan 範圍 ng- amp L1-009 N個數求和 (20 分) 本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數分子/分母的形式給出的,你輸出的和也必須是有理數的形式。 輸入格式: 輸入第一行給出一個正

L1-9 N個數求和

n) 判斷 整數 str 要求 只有一個 因數 個數 整型 本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數“分子/分母”的形式給出的,你輸出的和也必須是有理數的形式。 輸入格式: 輸入第一行給出一個正整數N(<=100)。隨後一行按格式“a1/

PTAL1-009 N個數求和解題報告---GCD & LCM

                                  L1-009 N個數求和&n

ZZULIOJ 1039: n個數求和

題目描述 輸入一個整數n和n個整數,輸出這n個整數的和。    輸入 輸入有兩行:第一行是一個正整數n,第二行是n個整數。    輸出 輸出一個整數,即n個數的和。輸出單獨佔一行。    樣例輸入

ZZULIOJ 1081: n個數求和 (多例項測試)

題目描述 求n個整數的和。    輸入 輸入第一行是一個整數T,表示有T組測試例項;  每組輸入包括兩行:  第一行一個數n表示接下來會有n個整數;  第二行空格隔開的n個數。    輸出 對於每組

【PTA 5-1 N個數求和 (20分)】+ gcd

5-1 N個數求和 (20分) 本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數分子/分母的形式給出的,你輸出的和也必須是有理數的形式。 輸入格式: 輸入第一行給出一個正整數N(\le≤100)。隨後一行按格式a1/b1 a2/b2

C4top-N個數求和 (分數求和模擬)

#include<bits/stdc++.h> using namespace std; #define INF 0xfffffff #define MAXN 1100 struct Node { long long x,y;//分子分母 } a[MAXN]; long long gc

任意n個數求和

給定一個數值,再輸入n個任意的數相加,如果和等於給定的數值,就輸出:YES! #include<iostream> using namespace std;  int main() {    int i,n,x,sum,s,a;    cin>>s>>n;   

N個數中取出任意個數求和為指定值的解

 題目來自CSDN的帖子: 原題是這樣的: 任意給一陣列,如{-10,45,35,99,10,6,9,20,17,18} 再任意給一個值,如35. 請從上面的陣列中找出所有的組合,使他們的和等於35. 例如對於上面的陣列,所有的組合情況為: 35; -10+45; 17+

n個數 取任意個數相加求和個數

// MicroSofrInterviewProblem2.cpp : Defines the entry point for the console application. //有若干個給定的數(都

D. Powerful array 離線+莫隊算法 給定n個數,m次查詢;每次查詢[l,r]的權值; 權值計算方法:區間某個數x的個數cnt,那麽貢獻為cnt*cnt*x; 所有貢獻和即為該區間的值;

code ++ 計算方法 equal ati contains tdi ces sum D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input st

排列組合問題:n個數中取k個數

() spa 條件 esp sizeof pac ret emp space /************************************有0~n-1共n個數,從其中任取k個數,*已知這k個數的和能被n整除,求這樣的*k個數的組合的個數sum,*輸入:n,k*