[L1-009]N个数求和 | PAT GPLT团体程序设计天梯赛

Description

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

Input

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

Output

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

Sample Input 1

5
2/5 4/15 1/30 -2/60 8/3

Sample Output 1

3 1/3

Sample Input 2

2
4/3 2/3

Sample Output 2

2

Sample Input 3

3
1/3 -1/6 1/8

Sample Output 3

7/24

Hint

利用 LCM 进行计算。

题解

#include "cstdio"
#include "iostream"
#include "cmath"
using namespace std;
int n;
long long num[100][2];
inline long long gcd(long long a, long long b)
{
    if (b == 0) return a;
    return gcd(b, a % b);
}
inline long long lcm(long long a, long long b)
{
    return a*b/gcd(a, b);
}
int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%lld/%lld", &num[i][0], &num[i][1]);
    for (int i = 0; i < n-1; i++)
    {
        long long t_lcm = lcm(num[i][1], num[i+1][1]);
        num[i+1][0] = num[i+1][0] * (t_lcm/num[i+1][1]) + num[i][0] * (t_lcm/num[i][1]);
        num[i+1][1] = t_lcm;
    }
    long long t_gcd = gcd(num[n-1][0], num[n-1][1]);
    while (t_gcd != 1)
    {
        num[n-1][0] /= t_gcd;
        num[n-1][1] /= t_gcd;
        t_gcd = gcd(num[n-1][0], num[n-1][1]);
    }
    bool chk = 1;
    if (num[n-1][0] % num[n-1][1] == 0)
        printf("%lld", num[n-1][0]/num[n-1][1]);
    else
    {
        if (num[n-1][0]/num[n-1][1] != 0)
            printf("%lld", num[n-1][0]/num[n-1][1]), chk = 0;
        num[n-1][0] %= num[n-1][1];
        if (num[n-1][0] != 0)
        {
            while (t_gcd != 1)
            {
                num[n-1][0] /= t_gcd;
                num[n-1][1] /= t_gcd;
                t_gcd = gcd(num[n-1][0], num[n-1][1]);
            }
            printf(chk ? "%lld/%lld": " %lld/%lld", num[n-1][0], num[n-1][1]);
        }
    }
    return 0;
}

[L1-021]重要的话说三遍 | PAT GPLT团体程序设计天梯赛

Description

这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— “I’m gonna WIN!”——连续输出三遍就可以了。

注意每遍占一行,除了每行的回车不能有任何多余字符。

题解

#include "cstdio"
#include "cstdlib"
#include "cstring"
#include "cmath"
int main()
{
    printf("I'm gonna WIN!\n");
    printf("I'm gonna WIN!\n");
    printf("I'm gonna WIN!");
    return 0;
}

[L1-019]谁先倒 | PAT GPLT团体程序设计天梯赛

Description

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

Input

输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(<=100),随后N行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中“喊”是喊出的数字,“划”是划出的数字,均为不超过100的正整数(两只手一起划)。

Output

在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。

Sample Input

1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16

Sample Output

A
1

题解

#include "cstdio"
#include "cstdlib"
#include "cstring"
#include "cmath"
int main()
{
    int limit_a, limit_b;
    scanf("%d%d", &limit_a, &limit_b);
    int n;
    scanf("%d", &n);
    int t_a = 0, t_b = 0, hand_a, hand_b, speak_a, speak_b;
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d%d%d", &speak_a, &hand_a, &speak_b, &hand_b);
        if (hand_a != hand_b)
        {
            if (hand_a == speak_a + speak_b)
                t_a++;
            else if (hand_b == speak_a + speak_b)
                t_b++;
            if (limit_a < t_a){
                printf("A\n%d", t_b);
                break;
            }
            else if (limit_b < t_b){
                printf("B\n%d", t_a);
                break;
            }
        }
    }
    return 0;
}

[L1-018]大笨钟 | PAT GPLT团体程序设计天梯赛

Description

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。

下面就请你写个程序,根据当前时间替大笨钟敲钟。

Input

输入第一行按照“hh:mm”的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。

Output

根据当前时间替大笨钟敲钟,即在一行中输出相应数量个“Dang”。如果不是敲钟期,则输出:

Only hh:mm. Too early to Dang.
其中“hh:mm”是输入的时间。

Sample Input 1

19:05

Sample Output 1

DangDangDangDangDangDangDangDang

Sample Input 2

07:05

Sample Output 2

Only 07:05.  Too early to Dang.

题解

#include "cstdio"
#include "cstdlib"
#include "cstring"
#include "cmath"
void Dang(int n)
{
    for (int i = 0; i < n; i++)
        printf("Dang");
}
int main()
{
    char str[6];
    gets(str);
    int hh = (str[0] - '0') * 10 + (str[1] - '0');
    int mm = (str[3] - '0') * 10 + (str[4] - '0');
    if (hh < 12 || (hh == 12 && mm == 0))
        printf("Only %s.  Too early to Dang.", str);
    else if (mm == 0)
        Dang(hh-12);
    else
        Dang(hh-11);
    return 0;
}

[L1-017]到底有多二 | PAT GPLT团体程序设计天梯赛

Description

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字“-13142223336”是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/111.52*100%,约为81.82%。本题就请你计算一个给定整数到底有多二。

Input

输入第一行给出一个不超过50位的整数N。

Output

在一行中输出N犯二的程度,保留小数点后两位。

Sample Input

-13142223336

Sample Output

81.82%

Hint

因为是计算百分比,所以要在小数结果后乘上100。
使用 %% 来输出 %

题解

#include "cstdio"
#include "cstdlib"
#include "cstring"
#include "cmath"
int main()
{
    char arr[52];
    gets(arr);
    float count = 0;
    int len = strlen(arr);
    for (int i = 0; i < len; i++)
        if (arr[i] == '2')
            count++;
    float res = count / (arr[0] == '-' ? (len-1)/1.5 : len) * ((arr[len-1]-'0') % 2 == 0 ? 2 : 1);  
    printf("%.2f%%\n", res*100);
    return 0;
}