中國大學MOOC-翁愷-C語言程式設計習題集-解答彙總
中國大學MOOC-翁愷-C語言程式設計習題集
PAT 習題集
02-0. 整數四則運算(10)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 喬林(清華大學)
本題要求編寫程式,計算2個正整數的和、差、積、商並輸出。題目保證輸入和輸出全部在整型範圍內。
輸入格式:
輸入在一行中給出2個正整數A和B。
輸出格式:
在4行中按照格式“A 運算子 B = 結果”順序輸出和、差、積、商。
輸入樣例:3 2輸出樣例:
3 + 2 = 5 3 - 2 = 1 3 * 2 = 6 3 / 2 = 1
#include <stdio.h> int main() { int A; int B; int X, Y, Z, W; scanf("%d %d", &A, &B); X = A + B; Y = A - B; Z = A * B; W = A / B; printf("%d + %d = %d\n" ,A, B, X); printf("%d - %d = %d\n", A, B, Y); printf("%d * %d = %d\n", A, B, Z); printf("%d / %d = %d\n", A, B, W); return 0; }
02-1. 釐米換算英尺英寸(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 翁愷(浙江大學)
如果已知英制長度的英尺foot和英寸inch的值,那麼對應的米是(foot+inch/12)*0.3048。現在,如果使用者輸入的是釐米數,那麼對應英制長度的英尺和英寸是多少呢?別忘了1英尺等於12英寸。
輸入格式:
輸入在一行中給出1個正整數,單位是釐米。
輸出格式:
在一行中輸出這個釐米數對應英制長度的英尺和英寸的整數值,中間用空格分開。
輸入樣例:170輸出樣例:
5 6
#include <stdio.h> int main() { int cm; scanf("%d", &cm); int foot = cm / 30.48; int inch = (cm/30.48 - foot) * 12; printf("%d %d", foot, inch); return 0; }
02-2. 然後是幾點(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 翁愷(浙江大學)
有時候人們用四位數字表示一個時間,比如1106表示11點零6分。現在,你的程式要根據起始時間和流逝的時間計算出終止時間。讀入兩個數字,第一個數字以這樣的四位數字表示當前時間,第二個數字表示分鐘數,計算當前時間經過那麼多分鐘後是幾點,結果也表示為四位數字。當小時為個位數時,沒有前導的零,即5點30分表示為530。注意,第二個數字表示的分鐘數可能超過60,也可能是負數。
輸入格式:
輸入在一行中給出2個整數,分別是四位數字表示的起始時間、以及流逝的分鐘數,其間以空格分隔。注意:在起始時間中,當小時為個位數時,沒有前導的零,即5點30分表示為530;流逝的分鐘數可能超過60,也可能是負數。
輸出格式:
輸出四位數字表示的終止時間。題目保證起始時間和終止時間在同一天內。
輸入樣例:1120 110輸出樣例:
1310
#include <stdio.h>
int main()
{
int i, j, x = 0, y, z;
scanf("%d%d", &i, &j);
if(i >= 1000)
{
x = i / 1000;
y = (i % 1000) / 100;
z = (i %1000) %100;
}
else
{
y = i / 100;
z = i % 100;
}
int s = (10*x + y) * 60 + z;
int n = s + j;
i = n / 60 *100 + (n - ((n / 60 )* 60));
printf("%d", i);
return 0;
}
02-3. 逆序的三位數(10)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 翁愷(浙江大學)
程式每次讀入一個正3位數,然後輸出按位逆序的數字。注意:當輸入的數字含有結尾的0時,輸出不應帶有前導的0。比如輸入700,輸出應該是7。
輸入格式:
每個測試是一個3位的正整數。
輸出格式:
輸出按位逆序的數。
輸入樣例:123輸出樣例:
321
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
int a = i % 100 %10;
int b = i / 100;
int c = i %100 / 10;
i = a*100 + b + c*10;
printf("%d", i);
return 0;
}
02-4. BCD解密(10)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 翁愷(浙江大學)
BCD數是用一個位元組來表達兩位十進位制的數,每四個位元表示一位。所以如果一個BCD數的十六進位制是0x12,它表達的就是十進位制的12。但是小明沒學過BCD,把所有的BCD數都當作二進位制數轉換成十進位制輸出了。於是BCD的0x12被輸出成了十進位制的18了!
現在,你的程式要讀入這個錯誤的十進位制數,然後輸出正確的十進位制數。提示:你可以把18轉換回0x12,然後再轉換回12。
輸入格式:
輸入在一行中給出一個[0, 153]範圍內的正整數,保證能轉換回有效的BCD數,也就是說這個整數轉換成十六進位制時不會出現A-F的數字。
輸出格式:
輸出對應的十進位制數。
輸入樣例:18輸出樣例:
12
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
int t = i % 16 + i / 16 * 10;
printf("%d", t);
return 0;
}
03-0. 超速判斷(10)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 楊起帆(浙江大學城市學院)
模擬交通警察的雷達測速儀。輸入汽車速度,如果速度超出60 mph,則顯示“Speeding”,否則顯示“OK”。
輸入格式:
輸入在一行中給出1個不超過500的非負整數,即雷達測到的車速。
輸出格式:
在一行中輸出測速儀顯示結果,格式為:“Speed: V - S”,其中V是車速,S或者是Speeding、或者是OK。
輸入樣例1:40輸出樣例1:
Speed: 40 - OK輸入樣例2:
75輸出樣例2:
Speed: 75 - Speeding
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
if(i <= 60)
printf("Speed: %d - OK", i);
else
printf("Speed: %d - Speeding", i);
return 0;
}
03-1. 三天打魚兩天晒網(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard
中國有句俗語叫“三天打魚兩天晒網”。假設某人從某天起,開始“三天打魚兩天晒網”,問這個人在以後的第N天中是“打魚”還是“晒網”?
輸入格式:
輸入在一行中給出1個不超過1000的正整數N。
輸出格式:
在一行中輸出此人在第N天中是“Fishing”(即“打魚”)還是“Drying”(即“晒網”),並且輸出“in day N”。
輸入樣例1:103輸出樣例1:
Fishing in day 103輸入樣例2:
34輸出樣例2:
Drying in day 34
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
if(i%5 <= 3 && i%5 != 0)
printf("Fishing in day %d", i);
else
printf("Drying in day %d", i);
return 0;
}
03-2. 用天平找小球(10)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard
三個球A、B、C,大小形狀相同且其中有一個球與其他球重量不同。要求找出這個不一樣的球。
輸入格式:
輸入在一行中給出3個正整數,順序對應球A、B、C的重量。
輸出格式:
在一行中輸出唯一的那個不一樣的球。
輸入樣例:1 1 2輸出樣例:
C
# include <stdio.h>
int main()
{
int A, B, C;
scanf("%d%d%d",&A, &B, &C);
if(A != B && B ==C)
printf("A");
else if(B != A && A == C)
printf("B");
else if(C != A && A == B)
printf("C");
return 0;
}
03-3. 12-24小時制(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 翁愷(浙江大學)
編寫一個程式,要求使用者輸入24小時制的時間,然後顯示12小時制的時間。
輸入格式:
輸入在一行中給出帶有中間的“:”符號(半形的冒號)的24小時制的時間,如12:34
表示12點34分。當小時或分鐘數小於10時,均沒有前導的零,如5:6
表示5點零6分。
提示:在scanf的格式字串中加入“:”,讓scanf來處理這個冒號。
輸出格式:
在一行中輸出這個時間對應的12小時制的時間,數字部分格式與輸入的相同,然後跟上空格,再跟上表示上午的字串“AM”或表示下午的字串“PM”。如“5:6 PM
”表示下午5點零6分。注意,在英文的習慣中,中午12點被認為是下午,所以24小時制的12:00
就是12小時制的12:0 PM
;而0點被認為是第二天的時間,所以是0:0 AM
。
21:11輸出樣例:
9:11 PM
#include <stdio.h>
int main()
{
int i, j;
scanf("%d:%d", &i, &j);
if(i >= 0 && i < 12)
printf("%d:%d AM", i, j);
else if(i == 12)
printf("%d:%d PM", i, j);
else if(i == 24)
printf("%d:%d AM", i-24, j);
else
printf("%d:%d PM", i-12, j);
return 0;
}
03-4. 成績轉換(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 沈睿(浙江大學)
本題要求編寫程式將一個百分制成績轉換為五分製成績。轉換規則:
大於等於90分為A;小於90且大於等於80為B;小於80且大於等於70為C;小於70且大於等於60為D;小於60為E。輸入格式:
輸入在一行中給出1個整數的百分制成績。
輸出格式:
在一行中輸出對應的五分製成績。
輸入樣例:90輸出樣例:
A
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
if(i >= 90)
printf("A");
else if(i < 90 && i >= 80)
printf("B");
else if(i < 80 && i >= 70)
printf("C");
else if(i < 70 && i >= 60)
printf("D");
else if(i < 60)
printf("E");
return 0;
}
04-0. 求符合給定條件的整數集(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 徐鏡春(浙江大學)
給定不超過6的正整數A,考慮從A開始的連續4個數字。請輸出所有由它們組成的無重複數字的3位數。
輸入格式:
輸入在一行中給出A。
輸出格式:
輸出滿足條件的的3位數,要求從小到大,每行6個整數。整數間以空格分隔,但行末不能有多餘空格。
輸入樣例:2輸出樣例:
234 235 243 245 253 254 324 325 342 345 352 354 423 425 432 435 452 453 523 524 532 534 542 543
#include <stdio.h>
int main()
{
int A, i, j, k, p = 0;
scanf("%d", &A);
for(i=A; i<A+4; ++i)
for(j=A; j<A+4; ++j)
for(k=A; k<A+4; ++k)
{
if(i != j && i != k && j != k)
{
printf("%d", i*100+10*j+k);
p++;
if(p%6 == 0)
printf("\n");
else
printf(" ");
}
}
return 0;
}
04-1. 水仙花數(20)
時間限制 2000 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 徐鏡春(浙江大學)
水仙花數是指一個N位正整數(N>=3),它的每個位上的數字的N次冪之和等於它本身。例如:153 = 13 + 53+ 33。本題要求編寫程式,計算所有N位水仙花數。
輸入格式:
輸入在一行中給出一個正整數N(3<=N<=7)。
輸出格式:
按遞增順序輸出所有N位水仙花數,每個數字佔一行。
輸入樣例:3輸出樣例:
153 370 371 407
#include <stdio.h>
int main()
{
int n = 0, m = 0, l = 0, k = 0, roll = 0;
int min = 1, t = 0, sum = 0, sum1 = 0;
scanf("%d", &n);
m=n;
while(m > 1) //built the minimum for n digit
{
min*=10;
m--;
}
t=min;
while(t < 10*min) //all the number for n digit
{
roll = t;
m = n;
sum = 1;
while(m > 0)
{
sum = sum*(roll%10);
m--;
}
l = n;
while(l > 0)
{
roll = roll / 10;
k = roll % 10;
m = n;
sum1 = 1;
while(m > 0)
{
sum1 = sum1 * k;
m--;
}
sum = sum + sum1;
l--;
}
if(t == sum)
{
printf("%d\n", t);
}
t++;
}
return 0;
}
04-2. 列印九九口訣表(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 徐鏡春(浙江大學)
下面是一個完整的下三角九九口訣表:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
本題要求對任意給定的1位正整數N,輸出從1*1到N*N的部分口訣表。
輸入格式:
輸入在一行中給出一個正整數N(1<=N<=9)。
輸出格式:
輸出下三角N*N部分口訣表,其中等號右邊數字佔4位、左對齊。
輸入樣例:4輸出樣例:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int i, j;
for (i=1; i<=n; i++)
{
for (j=1; j<=i; j++)
printf("%d*%d=%-4d", j, i, i*j);
puts("");
}
return 0;
}
04-3. 統計素數並求和(20)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 張彤彧(浙江大學)
本題要求統計給定整數M和N區間內素數的個數並對它們求和。
輸入格式:
輸入在一行中給出2個正整數M和N(1<=M<=N<=500)。
輸出格式:
在一行中順序輸出M和N區間內素數的個數以及它們的和,數字間以空格分隔。
輸入樣例:10 31輸出樣例:
7 143
#include <stdio.h>
#include <stdbool.h>
int nums(int x)
{
int i;
if(x ==1 ){
return 0;
}
for(i=2; i*i<=x; i++){
if(x%i == 0){
return 0;
}
}
return 1;
}
int main()
{
int m,n;
int j;
scanf("%d %d", &m, &n);
int count = 0;
int sum = 0;
for(j=m; j<=n; j++)
{
if(nums(j) == 1)
{
count++;
sum += j;
}
}
printf("%d %d", count, sum);
return 0;
}
04-4. 猜數字遊戲(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard
猜數字遊戲是令系統隨機產生一個100以內的正整數,使用者輸入一個數對其進行猜測,需要你編寫程式自動對其與隨機產生的被猜數進行比較,並提示大了(“Too big”),還是小了(“Too small”),相等表示猜到了。如果猜到,則結束程式。程式還要求統計猜的次數,如果1次猜出該數,提示“Bingo!”;如果3次以內猜到該數,則提示“Lucky You!”;如果超過3次但是在N(>3)次以內(包括第N次)猜到該數,則提示“Good Guess!”;如果超過N次都沒有猜到,則提示“Game Over”,並結束程式。如果在到達N次之前,使用者輸入了一個負數,也輸出“Game Over”,並結束程式。
輸入格式:
輸入第一行中給出2個不超過100的正整數,分別是系統產生的隨機數、以及猜測的最大次數N。隨後每行給出一個使用者的輸入,直到出現負數為止。
輸出格式:
在一行中輸出每次猜測相應的結果,直到輸出猜對的結果或“Game Over”則結束。
輸入樣例:58 4 70 50 56 58 60 -2輸出樣例:
Too big Too small Too small Good Guess!
#include <stdio.h>
int main()
{
int n, times;
int i, t = 0;
scanf("%d %d", &n, ×);
while(1)
{
scanf("%d", &i);
++t;
if(i == n && t == 1)
{
printf("Bingo!\n");
break;
}
else if(i < 0 || t > times )
{
printf("Game Over");
break;
}
else if(i == n && t > 1 && t <= 3 && t <= times)
{
printf("Lucky You!\n");
break;
}
else if(i > n)
{
printf("Too big\n");
}
else if(i < n && i > 0)
{
printf("Too small\n");
}
else if(i == n && t > 3 && t <= times)
{
printf("Good Guess!\n");
break;
}
}
return 0;
}
05-0. 求序列前N項和(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 張彤彧(浙江大學)
本題要求編寫程式,計算序列 2/1+3/2+5/3+8/5+... 的前N項之和。注意該序列從第2項起,每一項的分子是前一項分子與分母的和,分母是前一項的分子。
輸入格式:
輸入在一行中給出一個正整數N。
輸出格式:
在一行中輸出部分和的值,精確到小數點後2位。題目保證計算結果不超過雙精度範圍。
輸入樣例:20輸出樣例:
32.66
#include <stdio.h>
int main()
{
int n = 1, i;
double a = 2, b = 1, t, s = 0;
scanf("%d", &n);
for(i=1; i<=n; ++i)
{
t = a;
s += a/b;
a += b;
b = t;
}
printf("%.2lf", s);
return 0;
}
05-1. 約分最簡分式(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 翁愷(浙江大學)
分數可以表示為“分子/分母”的形式。編寫一個程式,要求使用者輸入一個分數,然後將其約分為最簡分式。最簡分式是指分子和分母不具有可以約分的成分了。如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 i, j, n, k;
scanf("%d/%d", &i, &j);
loop:
if(i >= j)
n = j;
else
n = i;
for(k=2; k<=n; ++k)
{
if(j % k == 0 && i % k == 0)
{
j /= k;
i /= k;
goto loop;
}
}
printf("%d/%d", i, j);
return 0;
}
05-2. 念數字(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 翁愷(浙江大學)
輸入一個整數,輸出每個數字對應的拼音。當整數為負數時,先輸出“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 <string.h>
char str[20];
const char *num[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
int main()
{
int i, k;
scanf("%s", str);
k = strlen(str);
if ( str[0] == '-') printf("fu");
else
printf("%s", num[str[0]-'0']);
for ( i=1; i<k; i++ )
{
printf(" %s", num[str[i]-'0']);
}
printf("\n");
return 0;
}
05-3. 求a的連續和(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 翁愷(浙江大學)
輸入兩個整數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 a, n, i, s = 0;
scanf("%d%d", &a, &n);
for(i=1; i<=n; ++i)
{
s += (pow(10.0,i)-1) * a / 9;
}
printf("%d", s);
return 0;
}
06-0. 混合型別資料格式化輸入(5)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 喬林(清華大學)
本題要求編寫程式,順序讀入浮點數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 f1, f2;
char ch;
int i;
scanf("%f %d %c %f", &f1, &i, &ch, &f2);
printf("%c %d %.2f %.2f", ch, i, f1, f2);
return 0;
}
06-1. 簡單計算器(20)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 張彤彧(浙江大學)
模擬簡單運算器的工作。假設計算器只能進行加減乘除運算,運算數和結果都是整數,4種運算子的優先順序相同,按從左到右的順序計算。
輸入格式:
輸入在一行中給出一個四則運算算式,沒有空格,且至少有一個運算元。遇等號”=”說明輸入結束。
輸出格式:
在一行中輸出算式的運算結果,或者如果除法分母為0或有非法運算子,則輸出錯誤資訊“ERROR”。
輸入樣例:1+2*10-10/2=輸出樣例:
10
#include <stdio.h>
int main()
{
char ch = '0';
int result, i, flag = 0;
scanf("%d", &result);
while( ch != '=' )
{
scanf("%c", &ch);
if(ch == '=')
break;
scanf("%d", &i);
if( ch == '+' )
result += i;
else if( ch == '-' )
result -= i;
else if( ch == '*' )
result *= i;
else if( ch == '/' )
{
if( i != 0 )
result /= i;
else
flag = 1;
}
else
flag = 1;
}
if(flag)
printf("ERROR\n");
else
printf("%d", result);
return 0;
}
06-2. 字串字母大小寫轉換(10)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 張彤彧(浙江大學)
輸入一個以#結束的字串,本題要求將小寫字母全部轉換成大寫字母,把大寫字母全部轉換成小寫字母,其它字元不變。
輸入格式:
輸入在一行中給出一個長度不超過40的、以#結束的非空字串。
輸出格式:
在一行中按照要求輸出轉換後的字串。
輸入樣例:Hello World! 123#輸出樣例:
hELLO wORLD! 123
#include <stdio.h>
int main()
{
char c;
c = getchar();
while(c != '#')
{
if(c >= 'a' && c <= 'z')
{
c -= 32;
}
else if(c >= 'A' && c <= 'Z')
{
c += 32;
}
printf("%c", c);
c = getchar();
}
return 0;
}
06-3. 單詞長度(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 翁愷(浙江大學)
你的程式要讀入一行文字,其中以空格分隔為若干個單詞,以‘.’結束。你要輸出每個單詞的長度。這裡的單詞與語言無關,可以包括各種符號,比如“it's”算一個單詞,長度為4。注意,行中可能出現連續的空格;最後的‘.’不計算在內。
輸入格式:
輸入在一行中給出一行文字,以‘.’結束。
提示:用scanf("%c",...);
來讀入一個字元,直到讀到‘.’為止。
輸出格式:
在一行中輸出這行文字對應的單詞的長度,每個長度之間以空格隔開,行末沒有最後的空格。
輸入樣例:
It's great to see you here.
輸出樣例:
4 5 2 3 3 4
#include <stdio.h>
int main()
{
char s[100];
int i = 0;
do
{
scanf("%c", &s[i]);
i++;
} while(s[i-1] != '.');
int j;
int cnt = 0;
int k = 0;
for(j=0; j<i; j++)
{
if(s[j] != ' ')
{
cnt++;
if(k != 0 && s[j] != '.')
{
printf(" ");
k = 0;
}
if(s[j] == '.' && s[j - 1] != ' ' && cnt != 1)
{
printf("%d", cnt-1);
}
}
else if(cnt != 0)
{
printf("%d", cnt);
cnt = 0;
k = 1;
}
}
return 0;
}
07-0. 寫出這個數 (20)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 CHEN, Yue
讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。
輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。
輸出格式:在一行內輸出n的各位數字之和的每一位,拼音數字間有1空格,但一行中最後一個拼音數字後沒有空格。
輸入樣例:1234567890987654321123456789輸出樣例:
yi san wu
#include <stdio.h>
#include <string.h>
const char *num[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
int main()
{
char ch, number[10];
int s = 0, i;
while( (ch = getchar()) != '\n' )
{
s += ch-'0';
}
sprintf(number, "%d", s);
printf("%s", num[number[0]-'0']);
for ( i=1; i<strlen(number); i++ )
{
printf(" %s", num[number[i]-'0']);
}
printf("\n");
return 0;
}
07-1. 換個格式輸出整數 (15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 CHEN, Yue
讓我們用字母B來表示“百”、字母S表示“十”,用“12...n”來表示個位數字n(<10),換個格式來輸出任一個不超過3位的正整數。例如234應該被輸出為BBSSS1234,因為它有2個“百”、3個“十”、以及個位的4。
輸入格式:每個測試輸入包含1個測試用例,給出正整數n(<1000)。
輸出格式:每個測試用例的輸出佔一行,用規定的格式輸出n。
輸入樣例1:234輸出樣例1:
BBSSS1234輸入樣例2:
23輸出樣例2:
SS123
#include <stdio.h>
int main()
{
int i, j, B, S;
scanf("%d", &i);
if(i >= 1 && i < 1000)
{
if(i >= 1 && i < 10)
{
for(j=1; j<=i; ++j)
{
printf("%d", j);
}
}
if(i >= 10 && i < 100)
{
S = i / 10;
for(j=1; j<=S; ++j)
{
printf("S");
}
i = i % 10;
for(j=1; j<=i; ++j)
{
printf("%d", j);
}
}
if(i >= 100 && i < 1000)
{
B = i / 100;
for(j=1; j<=B; ++j)
{
printf("B");
}
S = i /10 % 10;
for(j=1; j<=S; ++j)
{
printf("S");
}
i = i % 10;
for(j=1; j<=i; ++j)
{
printf("%d", j);
}
}
}
return 0;
}
07-2. A+B和C (15)
時間限制 50 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 HOU, Qiming
給定區間[-231, 231]內的3個整數A、B和C,請判斷A+B是否大於C。
輸入格式:
輸入第1行給出正整數T(<=10),是測試用例的個數。隨後給出T組測試用例,每組佔一行,順序給出A、B和C。整數間以空格分隔。
輸出格式:
對每組測試用例,在一行中輸出“Case #X: true”如果A+B>C,否則輸出“Case #X: false”,其中X是測試用例的編號(從1開始)。
輸入樣例:4 1 2 3 2 3 4 2147483647 0 2147483646 0 -2147483648 -2147483647輸出樣例:
Case #1: false Case #2: true Case #3: true Case #4: false
#include <stdio.h>
int main()
{
int t, i;
long a, j, k;
scanf("%d", &t);
if(t >= 1 && t <= 10)
{
for(i=1; i<=t; ++i)
{
scanf("%ld%ld%ld", &a, &j, &k);
if(a + j > k)
{
printf("Case #%d: true\n", i);
}
else
{
printf("Case #%d: false\n", i);
}
}
}
return 0;
}
07-3. 數素數 (20)
時間限制 100 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 CHEN, Yue
令Pi表示第i個素數。現任給兩個正整數M <= N <= 104,請輸出PM到PN的所有素數。
輸入格式:
輸入在一行中給出M和N,其間以空格分隔。
輸出格式:
輸出從PM到PN的所有素數,每10個數字佔1行,其間以空格分隔,但行末不得有多餘空格。
輸入樣例:5 27輸出樣例:
11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103
#include <stdio.h>
int a[10001];
int main()
{
int i, c = 0, j, p, m, n;
a[0] = 2;
for ( i=3; ;i+=2 )
{
p = 1;
for ( j=2; j*j<=i; j++ )
{
if ( i % j == 0 )
{
p = 0;
break;
}
}
if ( p )
{
a[++c] = i;
}
if ( c == 10000 ) break;
}
c = 0;
scanf("%d %d", &m, &n);
for ( i=m; i<=n; i++ )
{
c++;
printf("%d", a[i-1]);
if ( c % 10 == 0 )
printf("\n");
else if ( i < n )
printf(" ");
}
if ( c % 5 != 0 )
printf("\n");
return 0;
}
08-0. 查詢整數(10)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 楊起帆(浙江大學城市學院)
本題要求從輸入的N個整數中查詢給定的X。如果找到,輸出X的位置(從0開始數);如果沒有找到,輸出“Not Found”。
輸入格式:
輸入在第1行中給出2個正整數N(<=20)和X,第2行給出N個整數。數字均不超過長整型,其間以空格分隔。
輸出格式:
在一行中輸出X的位置,或者“Not Found”。
輸入樣例1:5 7 3 5 7 1 9輸出樣例1:
2輸入樣例2:
5 7 3 5 8 1 9輸出樣例2:
Not Found
#include <stdio.h>
#define N 1000
int a[N];
int main()
{
int n, key, i;
scanf("%d%d", &n, &key);
for ( i=0; i<n; i++ )
{
scanf("%d", &a[i]);
}
for ( i=0; i<n; i++ )
{
if ( a[i] == key )
{
printf("%d\n", i);
break;
}
}
if ( i == n )
{
printf("Not Found\n");
}
return 0;
}
08-1. 求一批整數中出現最多的個位數字(20)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 徐鏡春(浙江大學)
給定一批整數,分析每個整數的每一位數字,求出現次數最多的個位數字。例如給定3個整數1234、2345、3456,其中出現最多次數的數字是3和4,均出現了3次。
輸入格式:
輸入在第1行中給出正整數N(<=1000),在第2行中給出N個不超過整型範圍的正整數,數字間以空格分隔。
輸出格式:
在一行中按格式“M: n1 n2 ...”輸出,其中M是最大次數,n1、n2、……為出現次數最多的個位數字,按從小到大的順序排列。數字間以空格分隔,但末尾不得有多餘空格。
輸入樣例:3 1234 2345 3456輸出樣例:
3: 3 4
#include <stdio.h>
#include <string.h>
int a[1002];
int main()
{
int t, i, max = 0;
int count[10];
scanf("%d", &t);
for ( i=0; i<10; i++ )
{
count[i] = 0;
}
for ( i=0; i<t; i++ )
{
scanf("%d", &a[i]);
}
for ( i=0; i<t; i++ )
{
while (a[i])
{
count[a[i]%10]++;
a[i] /= 10;
}
}
for ( i=0; i<10; i++ )
{
if ( max < count[i] )
{
max = count[i];
}
}
printf("%d:", max);
for ( i=0; i<10; i++ )
{
if ( count[i] == max )
{
printf(" %d", i);
}
}
printf("\n");
return 0;
}
08-2. 求矩陣的區域性極大值(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 徐鏡春(浙江大學)
給定M行N列的整數矩陣A,如果A的非邊界元素A[i][j]大於相鄰的上下左右4個元素,那麼就稱元素A[i][j]是矩陣的區域性極大值。本題要求給定矩陣的全部區域性極大值及其所在的位置。
輸入格式:
輸入在第1行中給出矩陣A的行數M和列數N(3<=M,N<=20);最後M行,每行給出A在該行的N個元素的值。數字間以空格分隔。
輸出格式:
每行按照“元素值 行號 列號”的格式輸出一個區域性極大值,其中行、列編號從1開始。要求按照行號遞增輸出;若同行有超過1個區域性極大值,則該行按列號遞增輸出。若沒有區域性極大值,則輸出“None 總行數 總列數”。
輸入樣例1:4 5 1 1 1 1 1 1 3 9 3 1 1 5 3 5 1 1 1 1 1 1輸出樣例1:
9 2 3 5 3 2 5 3 4輸入樣例2:
3 5 1 1 1 1 1 9 3 9 9 1 1 5 3 5 1輸出樣例2:
None 3 5
#include <stdio.h>
int a[21][21];
int main()
{
int m, n, i, j, p = 0;
scanf("%d %d", &m, &n);
for ( i=0; i<m; i++ )
{
for ( j=0; j<n; j++ )
{
scanf("%d", &a[i][j]);
}
}
for ( i=1; i<m-1; i++ )
{
for ( j=1; j<n-1; j++ )
{
if ( a[i][j] > a[i][j+1] && a[i][j] > a[i][j-1] &&
a[i][j] > a[i+1][j] && a[i][j] > a[i-1][j] )
{
printf("%d %d %d\n", a[i][j], i+1, j+1);
p = 1;
}
}
}
if ( !p )
{
printf("None %d %d\n", m, n);
}
return 0;
}
08-3. 組個最小數 (20)
時間限制 100 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 CAO, Peng
給定數字0-9各若干個。你可以以任意順序排列這些數字,但必須全部使用。目標是使得最後得到的數儘可能小(注意0不能做首位)。例如:給定兩個0,兩個1,三個5,一個8,我們得到的最小的數就是10015558。
現給定數字,請編寫程式輸出能夠組成的最小的數。
輸入格式:
每個輸入包含1個測試用例。每個測試用例在一行中給出10個非負整數,順序表示我們擁有數字0、數字1、……數字9的個數。整數間用一個空格分隔。10個數字的總個數不超過50,且至少擁有1個非0的數字。
輸出格式:
在一行中輸出能夠組成的最小的數。
輸入樣例:2 2 0 0 0 3 0 0 1 0輸出樣例:
10015558
#include <stdio.h>
int b[10];
int main()
{
int i, j;
for ( i=0; i<10; i++ )
{
b[i] = 0;
}
for ( i=0; i<10; i++ )
{
scanf("%d", &b[i]);
}
for ( i=1; i<10; i++ )
{
if (b[i])
{
printf("%d", i);
b[i]--;
break;
}
}
for ( i=0; i<10; i++ )
{
for ( j=0; j<b[i]; j++ )
{
printf("%d", i);
}
}
printf("\n");
return 0;
}
10-0. 說反話 (20)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 CHEN, Yue
給定一句英語,要求你編寫程式,將句中所有單詞的順序顛倒輸出。
輸入格式:測試輸入包含一個測試用例,在一行內給出總長度不超過80的字串。字串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字串,單詞之間用1個空格分開,輸入保證句子末尾沒有多餘的空格。
輸出格式:每個測試用例的輸出佔一行,輸出倒序後的句子。
輸入樣例:Hello World Here I Come輸出樣例:
Come I Here World Hello
#include <stdio.h>
#include <string.h>
char str[81];
int main()
{
int i, k;
char *p;
gets(str);
k = strlen(str);
p = str + k;
while (1)
{
if ( p == str )
{
printf("%s\n", p);
break;
}
if (*p == ' ' && *(p+1) != ' ')
{
*p = '\0';
printf("%s ", p+1);
}
p--;
}
return 0;
}
10-1. 在字串中查詢指定字元(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 白洪歡(浙江大學)
輸入一個字串S,再輸入一個字元c,要求在字串S中查詢字元c。如果找不到則輸出“Not found”;若找到則輸出字串S中從c開始的所有字元。
輸入格式:
輸入在第1行中給出一個不超過80個字元長度的、以回車結束的非空字串;在第2行中給出一個字元。
輸出格式:
在一行中按照題目要求輸出結果。
輸入樣例1:It is a black box b輸出樣例1:
black box輸入樣例2:
It is a black box B輸出樣例2:
Not found
#include <string.h>
#include <stdio.h>
char str[180];
int main()
{
char ch;
int i, k, p = 0;
gets(str);
k = strlen(str);
scanf("%c", &ch);
for ( i=0; i<k; i++ )
{
if ( str[i] == ch )
{
p = 1;
}
if ( p )
{
printf("%c", str[i]);
}
}
if ( !p )
{
printf("Not found\n");
}
else
{
printf("\n");
}
return 0;
}
10-2. 刪除字串中的子串(20)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 白洪歡(浙江大學)
輸入2個字串S1和S2,要求刪除字串S1中出現的所有子串S2,即結果字串中不能包含S2。
輸入格式:
輸入在2行中分別給出不超過80個字元長度的、以回車結束的2個非空字串,對應S1和S2。
輸出格式:
在一行中輸出刪除字串S1中出現的所有子串S2後的結果字串。
輸入樣例:Tomcat is a male ccatat cat輸出樣例:
Tom is a male
#include <stdio.h>
#include <string.h>
char s1[81], s2[81];
int main()
{
int i, k;
gets(s1);
gets(s2);
char *p = strstr(s1, s2);
while(1)
{
char *p = strstr(s1, s2);
if ( p )
{
for ( i=0; i<strlen(p) - strlen(s2); i++ )
{
p[i] = p[strlen(s2) + i];
}
p[i] = '\0';
}
else
{
puts(s1);
break;
}
}
return 0;
}
10-3. 字串逆序(15)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 白洪歡(浙江大學)
輸入一個字串,對該字串進行逆序,輸出逆序後的字串。
輸入格式:
輸入在一行中給出一個不超過80個字元長度的、以回車結束的非空字串。
輸出格式:
在一行中輸出逆序後的字串。
輸入樣例:Hello World!輸出樣例:
!dlroW olleH
#include <stdio.h>
#include <string.h>
int main()
{
char str[81];
int k;
gets(str);
k = strlen(str);
k -= 1;
for ( k; k>=0; k-- )
{
printf("%c", str[k]);
}
printf("\n");
return 0;
}
10-4. 字串迴圈左移(20)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 白洪歡(浙江大學)
輸入一個字串和一個非負整數N,要求將字串迴圈左移N次。
輸入格式:
輸入在第1行中給出一個不超過100個字元長度的、以回車結束的非空字串;第2行給出非負整數N。
輸出格式:
在一行中輸出迴圈左移N次後的字串。
輸入樣例:Hello World! 2輸出樣例:
llo World!He
#include <stdio.h>
#include <string.h>
char str[103];
int main()
{
int i, k, n;
gets(str);
k = strlen(str);
scanf("%d", &n);
if ( n % k == 0 )
puts(str);
else
{
for ( i=n%k; i<k; i++ )
{
printf("%c", str[i]);
}
for ( i=0; i<n%k; i++ )
{
printf("%c", str[i]);
}
printf("\n");
}
return 0;
}
11-0. 平面向量加法(10)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 喬林(清華大學)
本題要求編寫程式,計算兩個二維平面向量的和向量。
輸入格式:
輸入在一行中按照“x1 y1 x2 y2”的格式給出兩個二維平面向量V1=(x1, y1)和V2=(x2, y2)的分量。
輸出格式:
在一行中按照“(x, y)”的格式輸出和向量,座標輸出小數點後1位(注意不能輸出-0.0)。
輸入樣例:3.5 -2.7 -13.9 8.7輸出樣例:
(-10.4, 6.0)
#include <stdio.h>
#include <math.h>
#define EPSILON 0.05
struct Vector {
double x;
double y;
};
int main(void)
{
struct Vector v1, v2, v3;
scanf("%lf%lf%lf%lf", &v1.x, &v1.y, &v2.x, &v2.y);
v3.x = v1.x + v2.x;
v3.y = v1.y + v2.y;
if(fabs(v3.x) < EPSILON)
v3.x = fabs(v3.x);
if(fabs(v3.y) < EPSILON)
v3.y = fabs(v3.y);
printf("(%.1f, %.1f)\n", v3.x, v3.y);
return 0;
}
11-1. 通訊錄的錄入與顯示(10)
時間限制 400 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 喬林(清華大學)
通訊錄中的一條記錄包含下述基本資訊:朋友的姓名、出生日期、性別、固定電話號碼、行動電話號碼。本題要求編寫程式,錄入N條記錄,並且根據要求顯示任意某條記錄。
輸入格式:
輸入在第1行給出正整數N(<=10);隨後N行,每行按照格式“姓名 生日 性別 固話 手機”給出一條記錄。其中“姓名”是不超過10個字元、不包含空格的非空字串;生日按“yyyy/mm/dd”的格式給出年月日;性別用“M”表示“男”、“F”表示“女”;“固話”和“手機”均為不超過15位的連續數字,前面有可能出現“+”。
在通訊錄記錄輸入完成後,最後一行給出正整數K,並且隨後給出K個整數,表示要查詢的記錄編號(