天天看點

PTA 程式設計天梯賽(61~80題)

文章目錄

    • 61、數素數 (20 分)
    • 62、德才論 (25 分)
    • 63、A除以B (20 分)
    • 64、錘子剪刀布 (20 分)
    • 65、月餅 (25 分)
    • 66、個位數統計 (15 分)
    • 67、 D進制的A+B (20 分)
    • 68、組個最小數 (20 分)
    • 69、 查驗身份證 (15 分)
    • 70、 跟奧巴馬一起程式設計 (15 分)
    • 71、 劃拳 (15 分)
    • 72、 組合數的和 (15 分)
    • 73、 判斷題 (15 分)
    • 74、圖像過濾 (15 分)
    • 75、 Wifi密碼 (15 分)
    • 76、 檢查密碼 (15 分)
    • 77、就不告訴你 (15 分)
    • 78、有多少不同的值 (20 分)
    • 79、 危險品裝箱 (25 分)
    • 80、 N-自守數 (15 分)

創作不易,有用請點個贊,感謝各位!

61、數素數 (20 分)

令 P

​i

​​ 表示第 i 個素數。現任給兩個正整數 M≤N≤10

​4

​​ ,請輸出 P

​M

​​ 到 P

​N

​​ 的所有素數。

輸入格式:

輸入在一行中給出 M 和 N,其間以空格分隔。

輸出格式:

輸出從 P

​M

​​ 到 P

​N

​​ 的所有素數,每 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>
#include<math.h>
int scnprim(int n);
int main()
{	
	int i,m,n,count=0;
	scanf("%d %d",&m,&n);
 
	for(i=2;;i++)
	{
		if(scnprim(i))
		{
			count++;
			if(m<=count&&n>=count)
			{	if((count-m+1)%10==0)
				printf("%d\n",i);
				else if(count!=n)
				printf("%d ",i);
				else
				printf("%d",i);
			}
		}
		if(n<count)
		{
			break;
		}
	}
	return 0;
}
int scnprim(int n)//篩選素數
{
	int sqrtc,j;
	sqrtc=(int)sqrt(n);
	for(j=2;j<=sqrtc;j++)
	{
		if(n%j==0)
			return 0;
 
	}
	return n;
}
           

62、德才論 (25 分)

1015 德才論 (25 分)

宋代史學家司馬光在《資治通鑒》中有一段著名的“德才論”:“是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。”

現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。

輸入格式:

輸入第一行給出 3 個正整數,分别為:N(≤10

​5

​​ ),即考生總數;L(≥60),為錄取最低分數線,即德分和才分均不低于 L 的考生才有資格被考慮錄取;H(<100),為優先錄取線——德分和才分均不低于此線的被定義為“才德全盡”,此類考生按德才總分從高到低排序;才分不到但德分到線的一類考生屬于“德勝才”,也按總分排序,但排在第一類考生之後;德才分均低于 H,但是德分不低于才分的考生屬于“才德兼亡”但尚有“德勝才”者,按總分排序,但排在第二類考生之後;其他達到最低線 L 的考生也按總分排序,但排在第三類考生之後。

随後 N 行,每行給出一位考生的資訊,包括:準考證号 德分 才分,其中準考證号為 8 位整數,德才分為區間 [0, 100] 内的整數。數字間以空格分隔。

輸出格式:

輸出第一行首先給出達到最低分數線的考生人數 M,随後 M 行,每行按照輸入格式輸出一位考生的資訊,考生按輸入中說明的規則從高到低排序。當某類考生中有多人總分相同時,按其德分降序排列;若德分也并列,則按準考證号的升序輸出。

輸入樣例:

14 60 80

10000001 64 90

10000002 90 60

10000011 85 80

10000003 85 80

10000004 80 85

10000005 82 77

10000006 83 76

10000007 90 78

10000008 75 79

10000009 59 90

10000010 88 45

10000012 80 100

10000013 90 99

10000014 66 60

輸出樣例:

12

10000013 90 99

10000012 80 100

10000003 85 80

10000011 85 80

10000004 80 85

10000007 90 78

10000006 83 76

10000005 82 77

10000002 90 60

10000014 66 60

10000008 75 79

10000001 64 90

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Student
{
	int name;	
	int de;
	int cai;
	int sum;
}love1[100100],love2[100100],love3[100100],love4[100100],love5[100100];	//love1是總的學生 
int comp(const void* a,const void* b)
{
	struct Student *aa = (struct Student *)a;
	struct Student *bb = (struct Student *)b;
	if(aa->sum != bb->sum)
	return ((bb->sum) - (aa->sum));
	else if(aa->de != bb->de)
	return ((bb->de) - (aa->de));
	else
	return ((aa->name) - (bb->name));
}
int main()
{
	int one=0,two=0,three=0,four=0,five=0;
	int i,j;
	int N,L,H;
	scanf("%d%d%d",&N,&L,&H);
	for(i=0;i<N;i++)
	{
		scanf("%d%d%d",&love1[i].name,&love1[i].de,&love1[i].cai);
		love1[i].sum = love1[i].de+love1[i].cai;
	}
	for(i=0;i<N;i++)
	{
		if(love1[i].de>=L && love1[i].cai>=L)
		{
			one++;
			if(love1[i].de>=H && love1[i].cai>=H)
			{	love2[two] = love1[i];		two++;		}
			else if(love1[i].cai<H && love1[i].de>=H)
			{	love3[three] = love1[i];	three++;	}
			else if(love1[i].de<H && love1[i].cai<H && love1[i].de>=love1[i].cai)
			{	love4[four] = love1[i];		four++;		}
			else
			{	love5[five] = love1[i];		five++;		}		
		}
	}
	printf("%d\n",one);
	qsort(love2,two,sizeof(love2[0]),comp);
	qsort(love3,three,sizeof(love3[0]),comp);
	qsort(love4,four,sizeof(love4[0]),comp);
	qsort(love5,five,sizeof(love5[0]),comp);
	
	for(i=0;i<two;i++)
	printf("%d %d %d\n",love2[i].name,love2[i].de,love2[i].cai);
	for(i=0;i<three;i++)
	printf("%d %d %d\n",love3[i].name,love3[i].de,love3[i].cai);
	for(i=0;i<four;i++)
	printf("%d %d %d\n",love4[i].name,love4[i].de,love4[i].cai);
	for(i=0;i<five;i++)
	printf("%d %d %d\n",love5[i].name,love5[i].de,love5[i].cai);
}
           

63、A除以B (20 分)

本題要求計算 A/B,其中 A 是不超過 1000 位的正整數,B 是 1 位正整數。你需要輸出商數 Q 和餘數 R,使得 A=B×Q+R 成立。

輸入格式:

輸入在一行中依次給出 A 和 B,中間以 1 空格分隔。

輸出格式:

在一行中依次輸出 Q 和 R,中間以 1 空格分隔。

輸入樣例:

123456789050987654321 7

輸出樣例:

17636684150141093474 3

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int i,j;
	int R,B,Q;
	//	餘數、除數、商
	char s[1000010];	//被除數 
	scanf("%s%d",&s,&B);
	int len = strlen(s);
	Q = (s[0]-'0')/B;
	R = (s[0]-'0')%B;
	if(Q!=0||len==1)      //除數比商大的情況要考慮
		printf("%d",Q); 
	for(i=1;i<len;i++)
	{
		Q = (R*10 + s[i]-'0') / B;
		R = (R*10 + s[i]-'0') % B;
		printf("%d",Q); 
	}
	printf(" %d\n",R);
}
           

64、錘子剪刀布 (20 分)

1018 錘子剪刀布 (20 分)

大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示:

PTA 程式設計天梯賽(61~80題)

現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,并且給出雙方分别出什麼手勢的勝算最大。

輸入格式:

輸入第 1 行給出正整數 N(≤10

​5

​​ ),即雙方交鋒的次數。随後 N 行,每行給出一次交鋒的資訊,即甲、乙雙方同時給出的的手勢。C 代表“錘子”、J 代表“剪刀”、B 代表“布”,第 1 個字母代表甲方,第 2 個代表乙方,中間有 1 個空格。

輸出格式:

輸出第 1、2 行分别給出甲、乙的勝、平、負次數,數字間以 1 個空格分隔。第 3 行給出兩個字母,分别代表甲、乙獲勝次數最多的手勢,中間有 1 個空格。如果解不唯一,則輸出按字母序最小的解。

輸入樣例:

10

C J

J B

C B

B B

B C

C C

C B

J B

B C

J J

輸出樣例:

5 3 2

2 3 5

B B

作者: CHEN, Yue

機關: 浙江大學

時間限制: 200 ms

記憶體限制: 64 MB

代碼長度限制: 16 KB

#include<stdio.h>
int main()
{
	int n;
	int i;
	int a=0,b=0,c=0,d=0,e=0,f=0;
	int one=0,two=0,three=0,four=0,five=0,six=0;
	char js,ys;		//代表甲的最大勝招,代表乙的最大勝招 
	int ping=0;
	char j,y;	//代表甲、乙 出的招數 
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++)
	{
		scanf("%c %c",&j,&y);
			 if(j=='C'&&y=='J')
		{ a++;		one++;		}
		else if(j=='J'&&y=='B')
		{	b++;	two++;		}
		else if(j=='B'&&y=='C')
		{	c++;	three++;	}
		else if(j=='B'&&y=='B')
		{		ping++;			}
		else if(j=='J'&&y=='J')
		{		ping++;			}
		else if(j=='C'&&y=='C')
		{		ping++;			}
			 if(y=='C'&&j=='J')
		{ 	d++;	four++;		}
		else if(y=='J'&&j=='B')
		{	e++;	five++;		}
		else if(y=='B'&&j=='C')
		{	f++;	six++;		}
		getchar();
	}
	
	//	先判斷甲的最大勝招 
	if(one>two&&one>three)
		js='C';
	else if(two>one&&two>three)
		js='J';
	else if(three>one&&three>two)
		js='B';
	else if(two==one&&two>three)
		js='C';
	else if(two==three&&three>one)
		js='B';
	else if(one==three&&two>one)
		js='J';
	else
		js='B';
		
	//	判斷乙的最大勝招
	if(four>five&&four>six)
		ys='C';
	else if(five>four&&five>six)
		ys='J';
	else if(six>four&&six>five)
		ys='B';
	else if(five==four&&five>three)
		ys='C';
	else if(five==six&&six>four)
		ys='B';
	else if(four==six&&five>four)
		ys='J';
	else
		ys='B';
		
		
	printf("%d %d %d\n",a+b+c,ping,(n-(a+b+c+ping)));
	printf("%d %d %d\n",d+e+f,ping,(n-(d+e+f+ping)));
	printf("%c %c\n",js,ys);
	
	
	return 0;
	
	
}
           

65、月餅 (25 分)

1020 月餅 (25 分)

月餅是中國人在中秋佳節時吃的一種傳統食品,不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量、總售價、以及市場的最大需求量,請你計算可以獲得的最大收益是多少。

注意:銷售時允許取出一部分庫存。樣例給出的情形是這樣的:假如我們有 3 種月餅,其庫存量分别為 18、15、10 萬噸,總售價分别為 75、72、45 億元。如果市場的最大需求量隻有 20 萬噸,那麼我們最大收益政策應該是賣出全部 15 萬噸第 2 種月餅、以及 5 萬噸第 3 種月餅,獲得 72 + 45/2 = 94.5(億元)。

輸入格式:

每個輸入包含一個測試用例。每個測試用例先給出一個不超過 1000 的正整數 N 表示月餅的種類數、以及不超過 500(以萬噸為機關)的正整數 D 表示市場最大需求量。随後一行給出 N 個正數表示每種月餅的庫存量(以萬噸為機關);最後一行給出 N 個正數表示每種月餅的總售價(以億元為機關)。數字間以空格分隔。

輸出格式:

對每組測試用例,在一行中輸出最大收益,以億元為機關并精确到小數點後 2 位。

輸入樣例:

3 20

18 15 10

75 72 45

輸出樣例:

94.50

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct love{
	double ax;		// 得到每種月餅一噸的單價 
	double k;		// 得到每種月餅的庫存量 
	double m;		//每種月餅的總售價 
}stu[1000];
int comp(const void* a,const void* b)
{
	struct love *aa = (struct love *)a;
	struct love *bb = (struct love *)b;
	return ((bb->ax)-(aa->ax));		//根據單價,成員排序好 
}
int main()
{
	int i,j;
	double money=0;
	double n;
	double d;		//最大需求量 
	scanf("%lf",&n);		//有幾種月餅 
	scanf("%lf",&d);		//最大需求量 
	//輸入月餅 的庫存量 
	for(i=0;i<n;i++)	
	{
		scanf("%lf",&stu[i].k);
	}
	//輸入月餅的總價 
	for(i=0;i<n;i++)
		scanf("%lf",&stu[i].m);	
	for(i=0;i<n;i++)
			stu[i].ax =  stu[i].m / stu[i].k;	//得到每種月餅的單價 
	qsort(stu,n,sizeof(stu[0]),comp);
	/*printf("%lf %d %d\n",stu[0].ax,stu[0].k,stu[0].m); //0下标為最大 
	printf("%lf %d %d\n",stu[1].ax,stu[1].k,stu[1].m); //0下标為最大 
	printf("%lf %d %d\n",stu[2].ax,stu[2].k,stu[2].m); //0下标為最大 */
	for(i=0;i<n;i++)
	{
		if(d<=stu[i].k)//如果最大需求量不大于目前庫存 
		{
			money+=stu[i].ax*d;//最大收益即目前單價乘以最大需求量 
			break;//注意及時退出 
		}
		else
		{
			money+=stu[i].m;//否則最大收益累加目前總價 
			d-=stu[i].k;//需求量減去目前庫存 
		}
	}
	printf("%.2lf\n",money);
}
           

66、個位數統計 (15 分)

給定一個 k 位整數 N=d

​k−1

​​ 10

​k−1

​​ +⋯+d

​1

​​ 10

​1

​​ +d

​0

​​ (0≤d

​i

​​ ≤9, i=0,⋯,k−1, d

​k−1

​​ >0),請編寫程式統計每種不同的個位數字出現的次數。例如:給定 N=100311,則有 2 個 0,3 個 1,和 1 個 3。

輸入格式:

每個輸入包含 1 個測試用例,即一個不超過 1000 位的正整數 N。

輸出格式:

對 N 中每一種不同的個位數字,以 D:M 的格式在一行中輸出該位數字 D 及其在 N 中出現的次數 M。要求按 D 的升序輸出。

輸入樣例:

100311

輸出樣例:

0:2

1:3

3:1

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int i,j;
	int x[10]={0};
	int xing;
	char s[1001];
	gets(s);
	int k = strlen(s);	//得到長度
	for(i=0;i<k;i++)
	{
		xing=s[i]-48;	//将字元串中的數字轉換為整型數字
		x[xing]++;		//将它作為數組下标,對應就+1
	}
	for(i=0;i<10;i++)
		if(x[i]!=0)
		printf("%d:%d\n",i,x[i]);
	return 0;
}

           

67、 D進制的A+B (20 分)

輸入兩個非負 10 進制整數 A 和 B (≤2

​30

​​ −1),輸出 A+B 的 D (1<D≤10)進制數。

輸入格式:

輸入在一行中依次給出 3 個整數 A、B 和 D。

輸出格式:

輸出 A+B 的 D 進制數。

輸入樣例:

123 456 8

輸出樣例:

1103

#include<stdio.h>
int main()
{
	int i,j;
	long  a,b,d;
	long  sum=0;
	int jin[31],k=0;
	scanf("%ld %ld %ld",&a,&b,&d);
	sum = a+b;
	if(sum==0)    //這裡要注意判斷當和等于0的情況,直接輸出0,不然進入循環要入坑
	{
	  printf("0");  
	  return 0;
	}
	while(sum!=0)			//十進制轉化為八進制就是一直除以8,每次的餘數就是八進制的每一位數,當sum=0時,跳出循環
	{
		jin[k++]=sum%d;
		sum/=d;
	}
	for(i=k-1;i>=0;i--)		//數組輸出八進制數時,要注意倒叙輸出
		printf("%d",jin[i]);
	return 0;
}
		

           

68、組個最小數 (20 分)

給定數字 0-9 各若幹個。你可以以任意順序排列這些數字,但必須全部使用。目标是使得最後得到的數盡可能小(注意 0 不能做首位)。例如:給定兩個 0,兩個 1,三個 5,一個 8,我們得到的最小的數就是 10015558。

現給定數字,請編寫程式輸出能夠組成的最小的數。

輸入格式:

輸入在一行中給出 10 個非負整數,順序表示我們擁有數字 0、數字 1、……數字 9 的個數。整數間用一個空格分隔。10 個數字的總個數不超過 50,且至少擁有 1 個非 0 的數字。

輸出格式:

在一行中輸出能夠組成的最小的數。

輸入樣例:

2 2 0 0 0 3 0 0 1 0

輸出樣例:

10015558

1023 組個最小數 (20 分)

#include<stdio.h>
int main()
{
	int i,j;
	int n;
	int flag = 0;
	int a[10]={0};
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);      //要注意題目要求開頭不能是0,是以從1開始若有這個數就先輸出一個,然後對應那個位置的值-1,下面在重新列印一次即可
		if(i>=1 && a[i]!=0 && flag>=0)
		{
			printf("%d",i);
			a[i]-=1;
			flag=-1;
			//	printf("\n-1\n");
		}
	}
	//printf("%d\t%d\t%d\n",a[0],a[1],a[2]);
	for(i=0;i<10;i++)
	{
		if(a[i]!=0)
		{
			while(a[i]--)
			printf("%d",i);
		}
	}
	return 0;
}
           

69、 查驗身份證 (15 分)

一個合法的身份證号碼由17位地區、日期編号和順序編号加1位校驗碼組成。校驗碼的計算規則如下:

首先對前17位數字權重求和,權重配置設定為:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然後将計算的和對11取模得到值Z;最後按照以下關系對應Z值與校驗碼M的值:

Z:0 1 2 3 4 5 6 7 8 9 10

M:1 0 X 9 8 7 6 5 4 3 2

現在給定一些身份證号碼,請你驗證校驗碼的有效性,并輸出有問題的号碼。

輸入格式:

輸入第一行給出正整數N(≤100)是輸入的身份證号碼的個數。随後N行,每行給出1個18位身份證号碼。

輸出格式:

按照輸入的順序每行輸出1個有問題的身份證号碼。這裡并不檢驗前17位是否合理,隻檢查前17位是否全為數字且最後1位校驗碼計算準确。如果所有号碼都正常,則輸出All passed。

輸入樣例1:

4

320124198808240056

12010X198901011234

110108196711301866

37070419881216001X

輸出樣例1:

12010X198901011234

110108196711301866

37070419881216001X

輸入樣例2:

2

320124198808240056

110108196711301862

輸出樣例2:

All passed

#include <stdio.h>  
#include <stdlib.h>  
   
int charToInt(char c)
{  
     return (int)(c-'0');  
 }  
 int main(int argc, char *argv[]) 
 {  
     int n,i,j,k=0,s,  
     a[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};  
     char cur,b[11]={'1','0','X','9','8','7','6','5','4','3','2'},  
     c[20];  
     scanf("%d",&n);  
     for(i = 0; i < n;i++)
	 {  
         s=0;  
         scanf("%s",&c);  
         for(j= 0;j<17;j++)
		 {  
             if(c[j]>='0'&&c[j]<='9')
			 {  
                 s+=charToInt(c[j])*a[j];  
			 }
			 else
			 {  
                 printf("%s",c);  
                 if(i<n-1)
				 {  
                     printf("\n");  
                 }  
                 s=-1;  
                 break;  
             }     
         }  
         if(b[s%11]==c[j]&&s!=-1)
		 {  
             k++;  
         }
		 else if(b[s%11]!=c[j]&&s!=-1)
		 {  
             printf("%s",c);  
             if(i<n-1)
			 {  
                 printf("\n");  
			 }  
         }  
     }  
     if(k==n)
	 {  
         printf("All passed");  
     }  
     return 0;  
}  
           

70、 跟奧巴馬一起程式設計 (15 分)

美國總統奧巴馬不僅呼籲所有人都學習程式設計,甚至以身作則編寫代碼,成為美國曆史上首位編寫計算機代碼的總統。2014 年底,為慶祝“計算機科學教育周”正式啟動,奧巴馬編寫了很簡單的計算機代碼:在螢幕上畫一個正方形。現在你也跟他一起畫吧!

輸入格式:

輸入在一行中給出正方形邊長 N(3≤N≤20)群組成正方形邊的某種字元 C,間隔一個空格。

輸出格式:

輸出由給定字元 C 畫出的正方形。但是注意到行間距比列間距大,是以為了讓結果看上去更像正方形,我們輸出的行數實際上是列數的 50%(四舍五入取整)。

輸入樣例:

10 a

輸出樣例:

aaaaaaaaaa

a a

a a

a a

aaaaaaaaaa

作者: CHEN, Yue

機關: 浙江大學

時間限制: 400 ms

記憶體限制: 64 MB

1036 跟奧巴馬一起程式設計 (15 分)

#include<stdio.h>
int main()
{
	int i,j,k;
	int n;
	char c;
	int flag=1;
	scanf("%d %c",&n,&c);
	for(i=0;i<n;i++)
	{
		printf("%c",c);
	}
	printf("\n");
	for(i=0;i<n-4;i++)
	{
		if(flag==-1)
		{
			//printf("\n");
			flag=1;
		}
		else
		{
			for(j=0;j<n;j++)
			{
				if(j==0||j==n-1)
				printf("%c",c);
				else
				printf(" ");
			}
			printf("\n");
			flag=-1;
		}
	}
	for(i=0;i<n;i++)
	{
		printf("%c",c);
	}
}
           

71、 劃拳 (15 分)

1046 劃拳 (15 分)

劃拳是古老中國酒文化的一個有趣的組成部分。酒桌上兩人劃拳的方法為:每人口中喊出一個數字,同時用手比劃出一個數字。如果誰比劃出的數字正好等于兩人喊出的數字之和,誰就赢了,輸家罰一杯酒。兩人同赢或兩人同輸則繼續下一輪,直到唯一的赢家出現。

下面給出甲、乙兩人的劃拳記錄,請你統計他們最後分别喝了多少杯酒。

輸入格式:

輸入第一行先給出一個正整數 N(≤100),随後 N 行,每行給出一輪劃拳的記錄,格式為:

甲喊 甲劃 乙喊 乙劃

其中喊是喊出的數字,劃是劃出的數字,均為不超過 100 的正整數(兩隻手一起劃)。

輸出格式:

在一行中先後輸出甲、乙兩人喝酒的杯數,其間以一個空格分隔。

輸入樣例:

5

8 10 9 12

5 10 5 10

3 8 5 12

12 18 1 13

4 16 12 15

輸出樣例:

1 2

1046 劃拳 (15 分)

#include<stdio.h>
int main()
{
	int i,j;
	int sum=0;
	int a,b,c,d;
	int jia=0,yi=0;
	int n;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d%d%d%d",&a,&b,&c,&d);
		sum=a+c;
		if(sum==b&&sum==d)
			continue;
		if(b==sum)
		yi++;
		else if(d==sum)
		jia++;
		sum=0;
	}
	printf("%d %d\n",jia,yi);
	
	
	
}
           

72、 組合數的和 (15 分)

1056 組合數的和 (15 分)

給定 N 個非 0 的個位數字,用其中任意 2 個數字都可以組合成 1 個 2 位的數字。要求所有可能組合出來的 2 位數字的和。例如給定 2、5、8,則可以組合出:25、28、52、58、82、85,它們的和為330。

輸入格式:

輸入在一行中先給出 N(1 < N < 10),随後給出 N 個不同的非 0 個位數字。數字間以空格分隔。

輸出格式:

輸出所有可能組合出來的2位數字的和。

輸入樣例:

3 2 8 5

輸出樣例:

330

1056 組合數的和 (15 分)

#include<stdio.h>
int main()
{
	int i,j;
	int n;
	int sum=0;
	int a[11];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		if(i!=j)
			sum+=a[i]*10+a[j];
	}
	printf("%d\n",sum);
	
	
	
}
           

73、 判斷題 (15 分)

1061 判斷題 (15 分)

判斷題的評判很簡單,本題就要求你寫個簡單的程式幫助老師判題并統計學生們判斷題的得分。

輸入格式:

輸入在第一行給出兩個不超過 100 的正整數 N 和 M,分别是學生人數和判斷題數量。第二行給出 M 個不超過 5 的正整數,是每道題的滿分值。第三行給出每道題對應的正确答案,0 代表“非”,1 代表“是”。随後 N 行,每行給出一個學生的解答。數字間均以空格分隔。

輸出格式:

按照輸入的順序輸出每個學生的得分,每個分數占一行。

輸入樣例:

3 6

2 1 3 3 4 5

0 0 1 0 1 1

0 1 1 0 0 1

1 0 1 0 1 0

1 1 0 0 1 1

輸出樣例:

13

11

12

1061 判斷題 (15 分)

#include<stdio.h>
int main()
{
	int i,j;
	int n,m;
	int a[100];
	int c[100];
	int b[100];
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d",&a[i]);		//輸入每道題的分值 
	}
	for(i=0;i<m;i++)
		scanf("%d",&c[i]);
	int x,sum=0;
	for(j=0;j<n;j++)
	{
		for(i=0;i<m;i++)
		{
			scanf("%d",&x);
			if(c[i]==x)
			{
				sum+=a[i];
			}
		}
		printf("%d\n",sum);
		sum=0;
	}
}
           

74、圖像過濾 (15 分)

1066 圖像過濾 (15 分)

圖像過濾是把圖像中不重要的像素都染成背景色,使得重要部分被凸顯出來。現給定一幅黑白圖像,要求你将灰階值位于某指定區間内的所有像素顔色都用一種指定的顔色替換。

輸入格式:

輸入在第一行給出一幅圖像的分辨率,即兩個正整數 M 和 N(0<M,N≤500),另外是待過濾的灰階值區間端點 A 和 B(0≤A<B≤255)、以及指定的替換灰階值。随後 M 行,每行給出 N 個像素點的灰階值,其間以空格分隔。所有灰階值都在 [0, 255] 區間内。

輸出格式:

輸出按要求過濾後的圖像。即輸出 M 行,每行 N 個像素灰階值,每個灰階值占 3 位(例如黑色要顯示為 000),其間以一個空格分隔。行首尾不得有多餘空格。

輸入樣例:

3 5 100 150 0

3 189 254 101 119

150 233 151 99 100

88 123 149 0 255

輸出樣例:

003 189 254 000 000

000 233 151 099 000

088 000 000 000 255

1066 圖像過濾 (15 分)

#include<stdio.h>
int main()
{
	int i,j;
	int m,n,a,b,c;
	int temp;
	int te[600][600];
	scanf("%d%d%d%d%d",&m,&n,&a,&b,&c);
	if(a>b)
	{
		temp=a;
		a=b;
		b=temp;
	}
	//printf("%d %d\n",a,b);
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&te[i][j]);
			if(te[i][j]>=a&&te[i][j]<=b)
			{
				te[i][j]=c;
			}
		}
	}
	for(i=0;i<m;i++)
	{
		for(j=0;j<n-1;j++)
		{
			printf("%03d ",te[i][j]);
		}
		printf("%03d\n",te[i][j]);
	}
	//printf("sda");
	
	
	
}
           

75、 Wifi密碼 (15 分)

1076 Wifi密碼 (15 分)

下面是微網誌上流傳的一張照片:“各位親愛的同學們,鑒于大家有時需要使用 wifi,又怕耽誤親們的學習,現将 wifi 密碼設定為下列數學題答案:A-1;B-2;C-3;D-4;請同學們自己作答,每兩日一換。謝謝合作!!~”—— 老師們為了促進學生學習也是拼了…… 本題就要求你寫程式把一系列題目的答案按照卷子上給出的對應關系翻譯成 wifi 的密碼。這裡簡單假設每道選擇題都有 4 個選項,有且隻有 1 個正确答案。

PTA 程式設計天梯賽(61~80題)

輸入格式:

輸入第一行給出一個正整數 N(≤ 100),随後 N 行,每行按照 編号-答案 的格式給出一道題的 4 個選項,T 表示正确選項,F 表示錯誤選項。選項間用空格分隔。

輸出格式:

在一行中輸出 wifi 密碼。

輸入樣例:

8

A-T B-F C-F D-F

C-T B-F A-F D-F

A-F D-F C-F B-T

B-T A-F C-F D-F

B-F D-T A-F C-F

A-T C-F B-F D-F

D-T B-F C-F A-F

C-T A-F B-F D-F

輸出樣例:

13224143

#include<stdio.h> 
#include<string.h> 
int main() { 
		int N; 
		scanf("%d", &N); // 8道
		getchar();
		for (int i = 0; i < N; i++)//每次處理一道題
		{ 
			char str[16]; 
			gets(str); //一整行  A-T B-F C-F D-F
			for (int j = 2; j < strlen(str); j += 4) 
				if (str[j] == 'T') 
					printf("%d", str[j - 2] - 'A' + 1); 
	} 
		return 0; 
}
           

76、 檢查密碼 (15 分)

1081 檢查密碼 (15 分)

本題要求你幫助某網站的使用者注冊子產品寫一個密碼合法性檢查的小功能。該網站要求使用者設定的密碼必須由不少于6個字元組成,并且隻能有英文字母、數字和小數點 .,還必須既有字母也有數字。

輸入格式:

輸入第一行給出一個正整數 N(≤ 100),随後 N 行,每行給出一個使用者設定的密碼,為不超過 80 個字元的非空字元串,以回車結束。

輸出格式:

對每個使用者的密碼,在一行中輸出系統回報資訊,分以下5種:

如果密碼合法,輸出Your password is wan mei.;

如果密碼太短,不論合法與否,都輸出Your password is tai duan le.;

如果密碼長度合法,但存在不合法字元,則輸出Your password is tai luan le.;

如果密碼長度合法,但隻有字母沒有數字,則輸出Your password needs shu zi.;

如果密碼長度合法,但隻有數字沒有字母,則輸出Your password needs zi mu.。

輸入樣例:

5

123s

zheshi.wodepw

1234.5678

WanMei23333

pass*word.6

輸出樣例:

Your password is tai duan le.

Your password needs shu zi.

Your password needs zi mu.

Your password is wan mei.

Your password is tai luan le.

1081 檢查密碼 (15 分)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int i,j;
	int n,k;
	char s[100];
	int flag=1;
	int shu=0,zi=0,luan=0,duan=0;
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++)
	{
		gets(s);
		int len = strlen(s);
		if(len<6)
		{
			printf("Your password is tai duan le.\n");
			continue;
		} 
		for(j=0;j<len;j++)
		{
			if((((s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z'))||(s[j]>='0'&&s[j]<='9'))==0&&s[j]!='.')
			{
				flag=1;
				break;
			}
			if(flag==-2&&(s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z'))
			{
				flag=-4;
			}
			else if(flag==-3&&s[j]>='0'&&s[j]<='9')
			{
				flag=-4;
			}
			else if(flag!=-4)
			{
				if(s[j]>='0'&&s[j]<='9')
				{
					flag=-2;
				}
				else if((s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z'))
				{
					flag=-3;
				}
			}
		}
		//printf("flag = %d\n",flag);
		if(flag==1)
			printf("Your password is tai luan le.\n");
		else if(flag==-4)
			printf("Your password is wan mei.\n");
		else if(flag==-2)
			printf("Your password needs zi mu.\n");
		else if(flag==-3)
			printf("Your password needs shu zi.\n");
		/*else if(flag==-1)
			printf("Your password is tai luan le.\n");*/
		flag=1;
		
	}
}
           

77、就不告訴你 (15 分)

1086 就不告訴你 (15 分)

做作業的時候,鄰座的小盆友問你:“五乘以七等于多少?”你應該不失禮貌地圍笑着告訴他:“五十三。”本題就要求你,對任何一對給定的正整數,倒着輸出它們的乘積。

PTA 程式設計天梯賽(61~80題)

輸入格式:

輸入在第一行給出兩個不超過 1000 的正整數 A 和 B,其間以空格分隔。

輸出格式:

在一行中倒着輸出 A 和 B 的乘積。

輸入樣例:

5 7

輸出樣例:

53

1086 就不告訴你 (15 分)

#include <stdio.h>
int main()
{
	int n1=0,n2=0,mul,count=0,i=0,flag=0; 
	int a[10];
	scanf("%d%d",&n1,&n2);
	mul=n1*n2;
	while(mul>0){
		a[count++]=mul%10;
		mul=mul/10;
	}
	for(i=0;i<count;i++){
		if(a[i]!=0){
			flag=1;
		}
		if(flag==1){
				printf("%d",a[i]);
		} 	
}
	return 0;
}
 

           

78、有多少不同的值 (20 分)

當自然數 n 依次取 1、2、3、……、N 時,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少個不同的值?(注:⌊x⌋ 為取整函數,表示不超過 x 的最大自然數,即 x 的整數部分。)

輸入格式:

輸入給出一個正整數 N(2≤N≤10

​4

​​ )。

輸出格式:

在一行中輸出題面中算式取到的不同值的個數。

輸入樣例:

2017

輸出樣例:

1480

1087 有多少不同的值 (20 分)

#include<stdio.h>
int main()
{
	int i,j;
	int n;
	int num;
	int a[10010],k=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		num = i/2+i/3+i/5;
		//printf("num = %d\n",num);
		if(i==1)
			a[k++]=num;
		for(j=0;j<k;j++)
		{
			if(num==a[j])
				break;
		}
		if(j==k)
			a[k++]=num;
	}
	printf("%d\n",k);
}
           

79、 危險品裝箱 (25 分)

1090 危險品裝箱 (25 分)

集裝箱運輸貨物時,我們必須特别小心,不能把不相容的貨物裝在一隻箱子裡。比如氧化劑絕對不能跟易燃液體同箱,否則很容易造成爆炸。

本題給定一張不相容物品的清單,需要你檢查每一張集裝箱貨品清單,判斷它們是否能裝在同一隻箱子裡。

輸入格式:

輸入第一行給出兩個正整數:N (≤10

​4

​​ ) 是成對的不相容物品的對數;M (≤100) 是集裝箱貨品清單的單數。

随後資料分兩大塊給出。第一塊有 N 行,每行給出一對不相容的物品。第二塊有 M 行,每行給出一箱貨物的清單,格式如下:

K G[1] G[2] … G[K]

其中 K (≤1000) 是物品件數,G[i] 是物品的編号。簡單起見,每件物品用一個 5 位數的編号代表。兩個數字之間用空格分隔。

輸出格式:

對每箱貨物清單,判斷是否可以安全運輸。如果沒有不相容物品,則在一行中輸出 Yes,否則輸出 No。

輸入樣例:

6 3

20001 20002

20003 20004

20005 20006

20003 20001

20005 20004

20004 20006

4 00001 20004 00002 20003

5 98823 20002 20003 20006 10010

3 12345 67890 23333

輸出樣例:

No

Yes

Yes

1090 危險品裝箱 (25 分)

#include<stdio.h>
struct wu{
 	int wu1;
	int wu2;
}W[20010];
	int main(){
	 int N,M;
	 scanf("%d%d",&N,&M);
	 int c[100010]={0};
	 int e;
	 for(int i=0;i<N;i++){
	  int a,b;
	  scanf("%d%d",&a,&b);
	  c[a]++;
	  c[b]++;
	  W[i].wu1=a;
	  W[i].wu2=b;
	 }
	 for(int j=0;j<M;j++){
	  int K;
	  scanf("%d",&K);
	  int flag=0;
	  int b[100010]={0}; 
	  for(int i=0;i<K;i++){
	   int d;
	   scanf("%d",&d);
	   if(flag==1){
	    continue;
	   }
	   else if(b[d]==1){
	    flag=1;
	    continue;
	   }
	   else if(c[d]!=0){
	    e=c[d];
	    for(int i=0;i<N;i++){
	     if(d==W[i].wu1){
	      b[W[i].wu2]=1;
	      c[d]--;
	     }
	     else if(d==W[i].wu2){
	      b[W[i].wu1]=1;
	      c[d]--;
	     }
	     if(c[d]==0){
	      break;
	     }
	    }
	    c[d]=e;
	   }
	  }
	  if(flag==1){
	   printf("No\n");
	  }
	  else{
	   printf("Yes\n");
	  }
	 }
	 return 0;
	}
           

80、 N-自守數 (15 分)

1091 N-自守數 (15 分)

如果某個數 K 的平方乘以 N 以後,結果的末尾幾位數等于 K,那麼就稱這個數為“N-自守數”。例如 3×92

​2

​​ =25392,而 25392 的末尾兩位正好是 92,是以 92 是一個 3-自守數。

本題就請你編寫程式判斷一個給定的數字是否關于某個 N 是 N-自守數。

輸入格式:

輸入在第一行中給出正整數 M(≤20),随後一行給出 M 個待檢測的、不超過 1000 的正整數。

輸出格式:

對每個需要檢測的數字,如果它是 N-自守數就在一行中輸出最小的 N 和 NK

​2

​​ 的值,以一個空格隔開;否則輸出 No。注意題目保證 N<10。

輸入樣例:

3

92 5 233

輸出樣例:

3 25392

1 25

No

1091 N-自守數 (15 分)

#include<stdio.h>
#include<math.h>
int funtion(int k)
{
	int mix=1;
	while(k)
	{
		mix*=10;
		k/=10;
	}
	return mix;
}
int main()
{
	int t;
	int n;
	int i,j;
	int x;
	int avg;
	int ge,shi,bai;
	int flag;
	int sum=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&x);
		t = funtion(x);
		sum = pow(x,2);
		flag=0;
		for(j=1;j<10;j++)
		{
			avg = sum*j;
			/*ge = avg%10;
			shi = avg/10%10;
			bai = avg/100%10;*/
			if((avg-x)%t==0)
			{
				printf("%d %d\n",j,avg);
				flag=1;
				break;
			}
			/*else if(x==ge+shi*10)
			{
				printf("%d %d\n",j,avg);
				flag=-1;
				break;
			}
			else if(x==ge+shi*10+bai*100)
			{
				printf("%d %d\n",j,avg);
				flag=-1;
				break;
			}*/
		}
		if(flag==0)
			printf("No\n");
		//flag=1;	
	}
}
           

創作不易,有用請點個贊,感謝各位!