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;
}