PTA 程序设计天梯赛(61~80题)

创作不易,有用请点个赞,感谢各位!

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 分)
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

在这里插入图片描述

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:
输入第 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 个正确答案。

在这里插入图片描述

输入格式:
输入第一行给出一个正整数 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 分)
做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。

在这里插入图片描述

输入格式:
输入在第一行给出两个不超过 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;	
	}
}

创作不易,有用请点个赞,感谢各位!

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值