1. 程式人生 > >PAT|中國大學MOOC-翁愷-C語言程式設計習題集17-20

PAT|中國大學MOOC-翁愷-C語言程式設計習題集17-20

05-1. 約分最簡分式(15)

分數可以表示為“分子/分母”的形式。編寫一個程式,要求使用者輸入一個分數,然後將其約分為最簡分式。最簡分式是指分子和分母不具有可以約分的成分了。如6/12可以被約分為1/2。當分子大於分母時,不需要表達為整數又分數的形式,即11/8還是11/8;而當分子分母相等時,仍然表達為1/1的分數形式。

輸入格式:

輸入在一行中給出一個分數,分子和分母中間以斜槓“/”分隔,如: 12/34 表示34分之12。分子和分母都是正整數(不包含0,如果不清楚正整數的定義的話)。

提示:在scanf的格式字串中加入“/”,讓scanf來處理這個斜槓。

輸出格式:

在一行中輸出這個分數對應的最簡分式,格式與輸入的相同,即採用“分子/分母”的形式表示分數。如 5/6表示6分之5。

輸入樣例:
60/120
輸出樣例:
1/2

#include <stdio.h>
int main()
{
    int num1, num2, t, s, mod,r;
    scanf("%d/%d", &num1, &num2);
    s = num1;
    r = num2;
    if (num1 < num2)
    {
        t = num1;
        num1 = num2;
        num2 = t;
    }
    while (num1%num2!=0)           
    {
        mod = num1%num2
; num1 = num2; num2 = mod; } s = s / num2; r = r / num2; printf("%d/%d", s, r); return 0; }

05-2. 念數字(15)

輸入一個整數,輸出每個數字對應的拼音。當整數為負數時,先輸出“fu”字。十個數字對應的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
輸入格式:

輸入在一行中給出一個整數,如: 1234 。

提示:整數包括負數、零和正數。

輸出格式:

在一行中輸出這個整數對應的拼音,每個數字的拼音之間用空格分開,行末沒有最後的空格。如 yi er san si。

輸入樣例:
-600
輸出樣例:
fu liu ling ling

#include <stdio.h>
#include <math.h>
int main()
{
    int n, num, len, i, j,a,b;
    int m[10];
    scanf("%d", &num);
    n = 1;
    if (num >0)
    {
        for (i = 0; i <= 9; i++)
        {
            if (num >= pow(10.0, i) && num <= pow(10.0, i + 1) - 1)
            {
                len = i + 1;
                break;
            }
        }
        m[0] = num / pow(10.0, len - 1);
        for (i = len-1; i >=1; i--)
        {
            a = num % (int)pow(10.0,i) / (int)pow(10.0,i-1 );
            m[n] = a;
            n++;
        }
        for (j = 0; j <= n-1; j++)
        {
            b = m[j];
            if (j < n - 1)
            {
                switch (b)
                {
                case 0:printf("ling "); break;
                case 1:printf("yi "); break;
                case 2:printf("er "); break;
                case 3:printf("san "); break;
                case 4:printf("si "); break;
                case 5:printf("wu "); break;
                case 6:printf("liu "); break;
                case 7:printf("qi "); break;
                case 8:printf("ba "); break;
                case 9:printf("jiu "); break;
                }
            }
            else
            {
                switch (b)
                {
                case 0:printf("ling"); break;
                case 1:printf("yi"); break;
                case 2:printf("er"); break;
                case 3:printf("san"); break;
                case 4:printf("si"); break;
                case 5:printf("wu"); break;
                case 6:printf("liu"); break;
                case 7:printf("qi"); break;
                case 8:printf("ba"); break;
                case 9:printf("jiu"); break;
                }
            }
        }


    }
    else if (num == 0)
    {
        printf("ling");
    }
    else
    {
        num = -num;
        for (i = 0; i <= 9; i++)
        {
            if (num >= pow(10.0, i) && num <= pow(10.0, i + 1) - 1)
            {
                len = i + 1;
                break;
            }
        }
        m[0] = num / pow(10.0, len - 1);
        for (i = len - 1; i >= 1; i--)
        {
            a = num % (int)pow(10.0, i) / (int)pow(10.0, i - 1);
            m[n] = a;
            n++;
        }
        printf("fu ");
        for (j = 0; j <= n - 1; j++)
        {
            b = m[j];
            if (j < n - 1)
            {
                switch (b)
                {
                case 0:printf("ling "); break;
                case 1:printf("yi "); break;
                case 2:printf("er "); break;
                case 3:printf("san "); break;
                case 4:printf("si "); break;
                case 5:printf("wu "); break;
                case 6:printf("liu "); break;
                case 7:printf("qi "); break;
                case 8:printf("ba "); break;
                case 9:printf("jiu "); break;
                }
            }
            else
            {
                switch (b)
                {
                case 0:printf("ling"); break;
                case 1:printf("yi"); break;
                case 2:printf("er"); break;
                case 3:printf("san"); break;
                case 4:printf("si"); break;
                case 5:printf("wu"); break;
                case 6:printf("liu"); break;
                case 7:printf("qi"); break;
                case 8:printf("ba"); break;
                case 9:printf("jiu"); break;
                }
            }
        }
    }
    return 0;
}

05-3. 求a的連續和(15)

輸入兩個整數a和n,a的範圍是[0,9],n的範圍是[1,8],求數列之和S = a+aa+aaa+…+aaa…a(n個a)。 如a為2、n為8時輸出的是2+22+222+…+22222222的和。

輸入格式:

輸入在一行中給出兩個整數,先後表示a和n。

輸出格式:

在一行中輸出要求的數列之和。

輸入樣例:
2 4
輸出樣例:
2468

#include <stdio.h>
#include <math.h>
int main()
{
    int num1, num2, i, k, a, sum1, sum2;
    sum2 = 0;
    scanf("%d%d", &num1, &num2);
    for (k = 1; k <= num2; k++)
    {
        sum1 = 0;
        for (i = 0; i <= k-1; i++)
        {
            a = num1 * pow(10.0, i);
            sum1 = sum1 + a;
        }
        sum2 = sum2 + sum1;
    }
    printf("%d", sum2);
    return 0;
}

06-0. 混合型別資料格式化輸入(5)

本題要求編寫程式,順序讀入浮點數1、整數、字元、浮點數2,再按照字元、整數、浮點數1、浮點數2的順序輸出。

輸入格式:

輸入在一行中順序給出浮點數1、整數、字元、浮點數2,其間以1個空格分隔。

輸出格式:

在一行中按照字元、整數、浮點數1、浮點數2的順序輸出,其中浮點數保留小數點後2位。

輸入樣例:
2.12 88 c 4.7
輸出樣例:
c 88 2.12 4.70

#include <stdio.h>
int main()
{
    float a, d;
    char c;
    int b;
    scanf("%f%d %c%f",&a,&b,&c,&d);
    printf("%c %d %.2f %.2f",c, b, a, d);
    return 0;
}