1. 程式人生 > >中國大學MOOC-翁愷-C語言程式設計習題集-解答彙總

中國大學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個整數,表示要查詢的記錄編號(