团体程序设计天梯赛练习(15分题目)

L1-003 个位数统计

//通过switch实现即可
#include<stdio.h>
int main(){
	char s[1001];
	scanf("%s",&s);
	//a[]数组用于统计每个数字出现次数
	//count用于统计有多少种数字,作为后续输出换行符的标志量
	int a[10]={0},count=0;
	for(int i=0;s[i]!='\0';i++){
		int x=s[i]-'0';
		switch(x){
			case 0:
				a[0]++;break;
			case 1:
				a[1]++;break;
			case 2:
				a[2]++;break;
			case 3:
				a[3]++;break;
			case 4:
				a[4]++;break;
			case 5:
				a[5]++;break;
			case 6:
				a[6]++;break;
			case 7:
				a[7]++;break;
			case 8:
				a[8]++;break;
			case 9:
				a[9]++;break;
			
		}
	}
	for(int i=0;i<10;i++)
		if(a[i]!=0) count++;
	for(int i=0;i<10;i++){
		if(a[i]!=0){
			printf("%d:%d",i,a[i]);
			count--;
			if(count!=0) printf("\n");
		}
	}
	return 0;
}

L1-005 考试座位号

//结构体方便些
#include<stdio.h>
#define A 1000
struct Stu{
	char a[17];//a[]为准考证号
	int x,y;//x,y分别为试机座位号和考试座位号 
}; 
int main(){
	int N;
	scanf("%d",&N);
	struct Stu stu[A];
	for(int i=0;i<N;i++)
	    scanf("%s %d %d",&stu[i].a,&stu[i].x,&stu[i].y);
	int M,m[A];
	scanf("%d",&M);
	for(int i=0;i<M;i++)
	    scanf("%d",&m[i]);
	for(int i=0;i<M;i++){
		for(int j=0;j<N;j++){
			if(stu[j].x==m[i])
			    printf("%s %d",stu[j].a,stu[j].y);
		}
		if(i!=M-1) printf("\n");
	}
	return 0;
}

L1-015 跟奥巴马画方块

//N最好用float类型,不容易出错
#include<stdio.h>
float round(float x){
	int a=(int)x;
	float b=x-a;
	if(b<0.5) return x;
	else return x+1;
	
}
int main(){
	float N;
	char c;
	scanf("%f %c",&N,&c);
	float x=N/2;
	int n=round(x);
	for(int i=0;i<n;i++){
		for(int j=0;j<N;j++)
		    printf("%c",c);
		if(i!=n-1) printf("\n");
	}
	return 0;
}

L1-016 查验身份证

//加权求和:数字和其对应的权重相乘,将所得结果累加
#include<stdio.h>
#include<string.h>
#define N 101
//digit函数用于判断字符串中除最后一位是否全为数字
int digit(char x[]){
	for(int i=0;i<17;i++){
		if(x[i]<'0'||x[i]>'9') return 0;
	}
	return 1;
}
int main(){
	int n,count=0;
	scanf("%d",&n);
	char id[N][19]; //这里注意长度为19,若用18则会把字符串拼接在一起,原因未知???
	int k=0;
	for(int i=0;i<n;i++)
	    scanf("%s",&id[i]);
	int q[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	char m[11]={'1','0','X','9','8','7','6','5','4','3','2'};
	for(int i=0;i<n;i++){
	    //num为乘权重后的值,sum为求得的和,mod为对11所取余数,flag为判断是否正确的标志量
		int num,sum=0,mod,flag=0;
		if(digit(id[i])==1){
			for(int j=0;j<17;j++){
				num=id[i][j]-'0';
				num*=q[j];
				sum+=num;
			}
			mod=sum%11;
			if(m[mod]==id[i][17]) flag=1;
		}
		if(flag==1) count++;
		else printf("%s\n",id[i]);
	}
	if(count==n) printf("All passed");
	return 0;
}

L1-017 到底有多二

//注意各种条件即可
#include<stdio.h>
#include<string.h>
#define N 50
int main(){
	char s[N];
	scanf("%s",&s);
	int len=strlen(s);
	float x=0,y=0,z; //x为2的个数,y为位数,z为犯二程度
	for(int i=0;i<=len-1;i++){
        if(s[i]!='-'){ //排除掉第一个为负号的情况
            y++;
		    if(s[i]=='2') x++;
        }
    }
	z=x/y;
	if(s[0]=='-') z*=1.5;
	if(s[len-1]%2==0) z*=2;
	printf("%.2f%%",100*z);
	return 0;
}

L1-019 谁先倒

//注意细节即可
#include<stdio.h>
#define A 101
int main(){
	int a,b; //a,b分别为甲,乙酒量
	int N;
	int j1[A],j2[A] ,y1[A],y2[A]; //j1,j2,y1,y2分别为甲喊,甲划,乙喊,乙划
	int j=0,y=0; //j,y分别为甲,乙喝的酒 
	scanf("%d %d",&a,&b);
	scanf("%d",&N);
	for(int i=0;i<N;i++)
	    scanf("%d %d %d %d",&j1[i],&j2[i],&y1[i],&y2[i]);
	for(int i=0;i<N;i++){
		if(j2[i]==(j1[i]+y1[i])&&y2[i]!=(j1[i]+y1[i])) j++;
		else if((y2[i]==(j1[i]+y1[i]))&&(j2[i]!=(j1[i]+y1[i]))) y++;
		else if(j2[i]==(j1[i]+y1[i])&&y2[i]==(j1[i]+y1[i])) continue;
		if(j>a||y>b) break;
	}
	if(j>a) printf("A\n%d",y);
	else if(y>b) printf("B\n%d",j);
	return 0;
}

L1-025 正整数A+B

//将每个条件的判断方法用函数实现不会乱
//注意A,B的输入格式与后续判断条件的关系
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int digit(int x){ //判断A,B转换为数字后是否在[1,1000]内,但无法判断是否包含小数点和空格 
	if(x>=1&&x<=1000) return 1;
	else return 0;
}
int numa(char s[]){ //判断A是否合法,条件为是否包含小数点 
	int len=strlen(s);
	for(int i=0;i<len;i++)
		if(s[i]=='.') return 0;
	return 1;
}
int numb(char s[]){ //判断B是否合法,条件为是否包含小数点和空格 
	int len=strlen(s);
	for(int i=0;i<len;i++)
	    if(s[i]=='.'||s[i]==' ') return 0;
	return 1;
}
int main(){
	char a[1001],b[1001];
	int x,y,sum;
	//通过getchar()逐个输入,若用scanf则会在输入B时遇到空格自动停止
	//依题意A的结束标志为第一个空格,B的结束标志为换行符 
	for(int i=0;i<5;i++){
		a[i]=getchar();
		if(a[i]==' ') break;
	}
	for(int i=0;i<5;i++){
		b[i]=getchar();
		if(b[i]=='\n') break;
	}
	x=atoi(a),y=atoi(b); //atoi()函数用于将字符串转换为数字 
	if(digit(x)==1&&digit(y)==1){
		if(numa(a)==1&&numb(b)==1){
			printf("%d + %d = %d",x,y,x+y);
		}
		else if(numa(a)==1&&numb(b)==0) printf("%d + ? = ?",x);
		else if(numa(a)==0&&numb(b)==1) printf("? + %d = ?",y);
		else if(numa(a)==0&&numb(b)==0) printf("? + ? = ?");
	}
	else if(digit(x)==1&&digit(y)==0) printf("%d + ? = ?",x);
	else if(digit(x)==0&&digit(y)==1) printf("? + %d = ?",y);
	else if(digit(x)==0&&digit(y)==0) printf("? + ? = ?");
	return 0;
}

L1-030 一帮一

//判断完成后把已判断过的性别变量设置为-1
#include<stdio.h>
#define A 50
int main(){
	int N;
	scanf("%d",&N);
	int gender[A];
	char name[A][9];
	for(int i=0;i<N;i++)
	    scanf("%d %s",&gender[i],&name[i]);
	for(int i=0;i<N/2;i++){
		for(int j=N-1;j>0;j--){
			if(gender[j]!=gender[i]&&gender[i]!=-1&&gender[j]!=-1){
			    printf("%s %s\n",name[i],name[j]);
			    gender[i]=-1,gender[j]=-1;
			    break;
			}
		}
	}
	return 0;
}

L1-035 情人节

//基础题
#include<stdio.h>
#define A 1000
int main(){
	char name[A][11];
	int len; //len为人数
	for(len=0;;len++){
		scanf("%s",&name[len]);
		if(name[len][0]=='.') break;
	}
	if(len>=14) printf("%s and %s are inviting you to dinner...",name[1],name[13]);
	else if(len>=2&&len<14) printf("%s is the only one for you...",name[1]);
	else if(len<2) printf("Momo... No one is for you ...");
	return 0;
}

L1-044 稳赢

//用数字记录出招相对方便
#include<stdio.h>
#define A 10000 
int main(){
	int K,k=0;
	scanf("%d",&K);
	char a[A][8],b[A][8]; //a,b分别为对手出招和我方出招
	int len;
	for(len=0;;len++){
		scanf("%s",&a[len]);
		if(a[len][0]=='E') break;
	}
	int x; //x记录对手出招,0为锤子,1为剪刀,2为布 
	for(int i=0;i<len;i++){
		if(a[i][0]=='C') x=0;
		else if(a[i][0]=='J') x=1;
		else if(a[i][0]=='B') x=2;
		if(k!=K){
			switch(x){
				case 0:
					printf("Bu\n");k++;break;
				case 1:
					printf("ChuiZi\n");k++;break;
				case 2:
					printf("JianDao\n");k++;break;
			}
		}
		else{
			switch(x){
				case 0:
					printf("ChuiZi\n");k=0;break;
				case 1:
					printf("JianDao\n");k=0;break;
				case 2:
					printf("Bu\n");k=0;break;
			}
		}
	}
	return 0;
}

L1-048 矩阵A乘以B

//根据矩阵乘法原理对每一项进行运算
//输出error时注意需输出具体的Ra,Cb
#include<stdio.h>
#define A 100
int main(){
	int Ra,Ca,Rb,Cb;
	int a[A][100],b[A][100],c[A][100]={0};
	scanf("%d %d",&Ra,&Ca);
	for(int i=0;i<Ra;i++){
		for(int j=0;j<Ca;j++)
		    scanf("%d",&a[i][j]);
	}
    scanf("%d %d",&Rb,&Cb);
	for(int i=0;i<Rb;i++){
		for(int j=0;j<Cb;j++)
		    scanf("%d",&b[i][j]);
	}
	if(Ca==Rb){
		printf("%d %d\n",Ra,Cb);
		for(int i=0;i<Ra;i++){
			for(int j=0;j<Cb;j++){
				for(int k=0;k<Ca;k++)
				    c[i][j]+=a[i][k]*b[k][j];
			}
		}
		for(int i=0;i<Ra;i++){
			for(int j=0;j<Cb;j++){
				if(j!=Cb-1) printf("%d ",c[i][j]);
				else printf("%d\n",c[i][j]);
			}
		}
	}
	else printf("Error: %d != %d",Ca,Rb);
	return 0;
}

L1-058 6翻了

//此题难点在于怎样判断6的个数及输出9或27
//方法为一个一个字符判断,若不为6则原样输出,为6则不输出,个数+1
//直到6字符串后的空格处
//若此字符串为句子中最后一个单词,则需通过s[len]判断,s[len]为'\0'
//根据6的个数按条件输出6字符串或9或27
#include<stdio.h>
#include<string.h>
int main(){
	char s[1001];
	gets(s);
	int count=0,flag=0,len=strlen(s); //count为6的个数,flag为判断此单词是否为6的标志量,flag=1则为6
	for(int i=0;i<=len;i++){ //此处循环条件应为i<=len,确保最后一个单词为6的时候可以输出
		if(s[i]=='6') //统计6的个数,并修改标志量
		    count++,flag=1;
		if(s[i]!='6'&&flag==1){ //这里的s[i]本质上为6字符串后的空格,将其替换为6或9或27
			if(count<=3)
				for(int j=0;j<count;j++)
				    printf("6");
			else if(count>3&&count<=9) printf("9");
			else if(count>9) printf("27");
			count=0,flag=0;
		}
		if(s[i]!='6'&&flag==0) //若不是6字符串则原样输出
		    printf("%c",s[i]);
	}
    return 0;
}

L1-062 幸运彩票

//基础题目
#include<stdio.h>
#define A 100
int main(){
	int N;
	char s[A][7];
	scanf("%d",&N);
	for(int i=0;i<N;i++)
	    scanf("%s",&s[i]);
	int sum1,sum2; //sum1为前三位和,sum2为后三位和 
	for(int i=0;i<N;i++){
		sum1=0,sum2=0;
		for(int j=0;j<6;j++){
			int x=s[i][j]-'0';
			if(j<=2) sum1+=x;
			else if(j>2) sum2+=x;
		}
		if(sum1==sum2) printf("You are lucky!\n");
		else printf("Wish you good luck.\n");
	}
	return 0;
}

L1-069 胎压监测

//基础题目,注意报警条件及标志量数组的使用 
#include<stdio.h>
#include<math.h>
int maxnum(int a[]){ //maxnum函数求数组中最大元素 
	int max=a[0];
	for(int i=0;i<4;i++)
		if(a[i]>max) max=a[i];
	return max;
}
int main(){
	int tyre[4],mintyre,threshold;
	scanf("%d %d %d %d %d %d",&tyre[0],&tyre[1],&tyre[2],&tyre[3],&mintyre,&threshold);
	int error[4]={0}; //error用于储存每个胎压与最大值的误差
	//flag为判断每个轮胎是否正常的标志量数组,count为报警轮胎数量
	int flag[4]={1,1,1,1},count=0; 
	int max=maxnum(tyre);
	for(int i=0;i<4;i++){
	    error[i]=abs(max-tyre[i]);
	    if(error[i]>threshold||tyre[i]<mintyre)
		    flag[i]=0;
    }
    int flag1=1; //flag1为判断是否有轮胎需要报警的标志量 
    for(int i=0;i<4;i++){
    	if(flag[i]==0)
		    flag1=0,count++;
	}
    if(flag1==1) printf("Normal");
    else{
    	if(count>=2) printf("Warning: please check all the tires!");
    	else{
    		for(int i=0;i<4;i++)
    			if(flag[i]==0) printf("Warning: please check #%d!",i+1);
		}
	}
	return 0;
}

L1-070 吃火锅

//难点为构造判断子串函数 
#include<stdio.h>
#include<string.h>
#define A 100
int isin(char s[],char c[]){
	int i=0,j=0;
	while(i<strlen(s)&&j<strlen(c)){
		if(s[i]==c[j]) i++,j++;
		else{
			i=i-j+1; //若不符合条件,则i返回上一次符合条件处的下一项地址,j返回0 
			j=0;
		}
		if(j==strlen(c)) return 1; //j=strlen(c)说明子串全部匹配成功
	}
	return 0;
}
int main(){
	char s[A],h[15]="chi1 huo3 guo1";
	//n为句子个数,m为第一次匹配成功处,count为匹配成功数 
	int n=0,m,count=0;
	while(gets(s)){
		if(s[0]=='.'&&strlen(s)==1) break;
		else{
			n++;
			if(isin(s,h)==1){
				count++; 
				if(count==1) m=n; //count=1表示第一次匹配成功 
			}
		}
	}
	printf("%d\n",n);
	if(count==0) printf("-_-#");
	else printf("%d %d",m,count);
	return 0; 
} 

L1-077 大笨钟的心情

//基础题
#include<stdio.h>
int main(){
	int mood[24],time;
	for(int i=0;i<24;i++)
	    scanf("%d",&mood[i]);
	while(scanf("%d",&time)){
		if(time<0||time>23) break;
		else{
			if(mood[time]>50) printf("%d Yes\n",mood[time]);
			else printf("%d No\n",mood[time]);
		}
	}
	return 0;
}

L1-078 吉老师的回归

//难点1:如何判断是否为有效题,并通过特殊字符简便判断
//难点2:先要判断已做完的M道题中是否有M道有效题,若没有则说明已经做完
//难点3:若已做完的M道题中有M道有效题,再在后续题目中查找是否有有效题
#include<stdio.h>
#include<string.h>
#define A 30
int isin(char s[],char c[]){
	int i=0,j=0;
	while(i<strlen(s)&&j<strlen(c)){
		if(s[i]==c[j])
		    i++,j++;
		else i=i-j+1,j=0;
		if(j==strlen(c)) return 1;
	}
	return 0;
} 
int main(){
	int N,M;
	scanf("%d %d",&N,&M);
	//test1为输入字符串,test2为test1的备份 
	char test1[A][501],test2[A][501],qd[8]={"qiandao"},easy[5]={"easy"};
	int t=-1; //t为吉先生正在做的题 
    getchar(); //getchar消除scanf和gets中的空格 
	for(int i=0;i<N;i++){
	    gets(test1[i]);
	    strcpy(test2[i],test1[i]);
	}
	for(int i=0;i<N;i++)
	    //将有效题目的首字母改为'1' 
	    if(isin(test1[i],qd)==0&&isin(test1[i],easy)==0) test1[i][0]='1';
    int count=0; //count为有效题目的数量
	//此循环用于判断吉先生做的M道题的数量是否等于有效题目的数量 
    for(int i=0;i<N;i++){
        if(test1[i][0]=='1'&&count<M) count++;
        //count==M说明M道题中有M道有效题,则从下一项开始判断是否存在新的有效题 
        else if(count==M){
            count=i;
            break;
        }
    }
    //count<M说明M道题中没有M道有效题,即吉老师已经做完 
    if(count<M) printf("Wo AK le");
    else{
    	//此循环求M道有效题目后的第一道有效题目,也就是吉老师正在做的题目 
        for(int i=count;i<N;i++)
            if(test1[i][0]=='1'){
            	t=i;
            	break;
			}
		//若t!=-1说明存在在M道有效题目后的有效题目
		//若t==-1说明M道有效题目后再无有效题目,即吉老师做完了 
	    if(t!=-1) printf("%s",test2[t]);
	    else printf("Wo AK le");
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值