补充练习

这是一系列编程练习题的概述,包括各种类型的题目,如数字转换、评分系统、除法计算器、平均值计算、字母大小写转换、日期计算、最大公约数、歌德巴赫猜想、整数分析、选号程序、日期计算、统计正整数个数、跳一跳游戏、数值数位之和、小球下落问题、输出金字塔、位数判断、回文数检测、0-1矩阵分析、相邻区域判断、灰度直方图计算、密码强度评估、图像旋转、画图、密码编译、数组逆序排列、数组元素平移、后项除以前项、单词排序、字符拷贝、寻找最长的行、括号匹配、表达式求值、字符串查找、目录操作、字符串相似度计算、ISBN号码验证和字符串处理等。这些题目覆盖了基础计算、逻辑控制、数据结构、算法分析等多个编程领域。

补充练习

3.输入一个小于255的十进制非负整数,输出对应的二进制、八进制和十六进制

#include <stdio.h>
#include<stdlib.h>
int main()
{
    int a;
	char s[10];
    scanf("%d",&a);
	itoa(a, s, 2);
    printf("%s %o %X ",s,a,a);
    return 0;
}

歌唱比赛

题目描述:
为歌唱比赛设计一个评分系统,规则如下:
共有n名评委给分(0~100分,整数),要求去掉一个最高分,去掉一个最低分,剩余成绩的平均分为最终得分。

输入一个正整数n(3≤n≤10),表示有n个评委,输入n个成绩,输出最终得分。

输入格式:第一行输入一个正整数n(3≤n≤10),第二行输入每位评委给分,用空格分隔。

输出格式:输出最终得分,结果保留两位小数。

示例:
输入:5
70 75 80 85 90
输出:80.00

#include<stdio.h>
int main()
{
/**************************函数参数********************************************
num			评委人数 
average		平均分 
score[10]	得分 
i,j,k		临时变量 
*******************************************************************************/
	int num;
	double average=0;
	int score[10];
	int i,j,k;
	
	/*输入*/ 
	scanf("%d",&num);
	for(i=0;i<num;i++)
	scanf("%d",&score[i]);
	
	/*排序*/
	for(i=0;i<num-1;i++)
	for(j=i;j<num;j++)
	if(score[i]<score[j]){
		k=score[i];
		score[i]=score[j];
		score[j]=k;
	}
	
	/*求平均*/
	for(i=1;i<num-1;i++)
	average=average+score[i]*1.0/(num-2);
	
	/*打印*/
	printf("%.2f\n",average);
	
	return 0;
}

除法计算器

标题
除法计算器

类别
基本计算

时间限制
1S

内存限制
256Kb

问题描述
小明的弟弟刚开始学习除法,为了检查弟弟的计算结果是否正确,小明决定设计一个简单计算器程序来验算。

输入说明
输入数据由四个整数m,n,q,r构成,m为被除数,n为除数,q和r为小明的弟弟计算出的商和余数。整数之间用空格分隔,所有整数取值范围在(-100000~100000),n不为0。

输出说明
如果验算结果正确,输出yes,否则输出正确的商和余数

输入样例
输入样例:
样例1:
10 3 3 1
样例2:
10 3 3 2

输出样例
样例1输出:
yes
样例2输出:
3 1

#include<stdio.h>
int main()
{
	int m,n,p,r;
	
	scanf("%d%d%d%d",&m,&n,&p,&r);
	
	if(p==m/n&&r==m%n)
	printf("yes");
	else
	printf("%d %d",m/n,m%n);
	
	return 0;
}

求平均值

题目描述:计算三个整数的平均值,结果保留两位小数。

输入格式:共一行,包含三个整数,整数之间用空格分隔。

输出格式:共一行,输出平均值,结果保留两位小数。

输入示例:20 42 55

输出示例:39.00

#include<stdio.h>
int main()
{
	int num1,num2,num3;
	double ave;
	
	scanf("%d%d%d",&num1,&num2,&num3);
	
	ave=(num1+num2+num3)*1.0/3;
	
	printf("%.2f",ave);
	
	return 0;
	
}

4.输入一个字母,若输入小写字母,转换为大写输出,若输入大写字母,转换为小写输出

#include<stdio.h>
int main()
{
	//输入一个字母,若输入小写字母,转换为大写输出,
	//若输入大写字母,转换为小写输出
	char a;
	scanf("%c",&a);
	
	if(a<'z'&&a>'a')
	printf("%c",a-32);
	else if(a<'Z'&&a>'A')
	printf("%c",a+32);
	
	return 0;
 } 

计算某月天数

标题:计算某月天数
类别:流程控制
时间限制:2S
内存限制:10000Kb
问题描述:
每年的1,3,5,7,8,10,12月有31天,4,6,9,11月有30天,闰年2月29天,其他年份2月28天,给定年份和月份求该月的天数

输入说明:
输入由两个正整数a和b构成,a表示年份,b表示月份,a和b之间用空格分隔

输出说明:
根据年份和月份计算该月天数并输出

输入样例
输入样例1
2000 3
输入样例2
2001 2
输出样例
输出样例1
31
输出样例2
28

#include<stdio.h>
int main()
{
	int year,month,day;
	
	scanf("%d%d",&year,&month);
	
	if(month==2){
	if((year%4==0&&year%100!=0)||year%400==0)
		printf("29");
	else
		printf("28");
	}
	else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
	printf("31");
	else
	printf("30");
	
	return 0;
	
}

最大公约数

标题:
最大公约数

类别:

时间限制:
1 S

内存限制:
1000 Kb

问题描述:
最大公约数(GCD)指某几个整数共有因子中最大的一个,最大公约数具有如下性质,
gcd(a,0)=a
gcd(a,1)=1
因此当两个数中有一个为0时,gcd是不为0的那个整数,
当两个整数互质时最大公约数为1。
输入两个整数a和b,求最大公约数

输入说明:
输入为两个非负整数a和b(0<=a,b<10000),a和b之间用空格分隔,

输出说明:
输出其最大公约数

输入样例:
样例1输入
2 4
样例2输入:
12 6
样例3输入:
3 5

输出样例:
样例1输出
2
样例2输出
6
样例3输出
1

#include<stdio.h>
void gcd(int x,int y);
int i;
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	
	if(a==0)
	printf("%d",b);
	else if(b==0)
	printf("%d",a);
	else if(a==1||b==1)
	printf("1");
	else
	gcd(a,b);
	
	return 0;
}
void gcd(int x,int y)
{
	if(x<y)
	i=y;
	else
	i=x;
	while(1){
		if(x%i==0&&y%i==0){
			printf("%d",i);
			break; 
		}
		else {
			i--;
		}	
	}
}

歌德巴赫猜想

标题
歌德巴赫猜想

类别
函数与递归

时间限制
2S

内存限制
10000Kb

问题描述
德巴赫猜想:
任意一个大偶数都能分解为两个素数的和,
对与输入的一个正偶数,写一个程序来验证歌德巴赫猜想。
由于每个正偶数可能分解成多组素数和,仅输出分解值分别是最小和最大素数的一组,按从小到大顺序输出。

输入说明
输入一个正偶数n,1<n<1000。

输出说明
输出分解出的两个最小和最大素数。

输入样例
10

输出样例
3 7

#include<stdio.h>
int prime_number(int x);
int n;
int i,j,k,l,m,h;
int main()
{
	scanf("%d",&n);
	if(n==2||n==4)
	printf("2 2");
	else{
		for(k=2;k<n;k++){
			l=n-k;
			if(prime_number(k)==1&&prime_number(l)==1){
				printf("%d %d",k,l);
				break;
			}
		}
	}
	
	return 0;
}

int prime_number(int x)
{
	j=1;
	i=2;
	while(1){
		if(x%i==0&&i<x){
		j=0;
		break;
	}
	else{
		i++;
		if(i>=x)
		break;
	}
	}
	return j;
}

整数分析

标题
整数分析

类别
流程控制

时间限制
1S

内存限制
256Kb

问题描述
给出一个整数n(0<=n<=100000000)。求出该整数的位数,以及组成该整数的所有数字中的最大数字和最小数字。

输入说明
输入一个整数n(0<=n<=100000000)

输出说明
在一行上依次输出整数n的位数,以及组成该整数的所有数字中的最大数字和最小数字,各个数字之间用空格分隔。

输入样例
217

输出样例
3 7 1

#include<stdio.h>
int main()
{
	int count[20];
	int num,xnum;
	int i,j,k,l;
	
	xnum=0;
	i=0;
	
	scanf("%d",&num);
	
	if(num==0)
	printf("1 0 0");
	else {
	while(num>0){
		count[i]=num%10;
		i++;
		xnum++;
		num=num/10;
	}
	
	
	for(j=0;j<i-1;j++)
	for(k=j;k<i;k++)
	if(count[j]<count[k]){
		l=count[j];
		count[j]=count[k];
		count[k]=l;
	}
	
	printf("%d %d %d",xnum,count[0],count[i-1]);
	}
	return 0;
}

选号程序

标题
选号程序

类别
流程控制

时间限制
1S

内存限制
256Kb

问题描述
小明决定申请一个新的QQ号码,系统随机生成了若干个号码供他选择。小明的选号原则是:

  1. 选择所有号码中各位数字之和最大的号码。
  2. 如果有多个号码各位数字之和相同则选择数值最大的号码。
    请你写一个程序帮助小明选择一个QQ号码。

输入说明
输入数据由两行构成,第一行为一个整数n表示有n个待选号码(0<n<100),第二行有n个正整数,表示各个待选的号码,每个号码长度不超过9位数。每个号码之间用空格分隔,且每个号码都不相同。

输出说明
输出根据小明的选号原则选出的号码。

输入样例
5
10000 11111 22222 333 1234

输出样例
22222

#include<stdio.h>
int xcount[9],xsum;
int j,i;
int sum(int x);
struct QQ{
	int count;
	int xxsum;
};
int main()
{
	int num;
	int l,m,n;
	struct QQ xxnum[100];
	
	scanf("%d",&num);
	for(l=0;l<num;l++){
		scanf("%d",&xxnum[l].count);
	}
	
	for(l=0;l<num;l++){
		xxnum[l].xxsum=sum(xxnum[l].count);
	}
	
	for(l=0;l<num-1;l++)
	for(m=l;m<num;m++)
	{
		if(xxnum[l].xxsum<xxnum[m].xxsum)
		{
			n=xxnum[l].xxsum;
			xxnum[l].xxsum=xxnum[m].xxsum;
			xxnum[m].xxsum=n;
			n=xxnum[l].count;
			xxnum[l].count=xxnum[m].count;
			xxnum[m].count=n;		
		}
	}
	for(l=0;l<num;l++){
		if(xxnum[l].xxsum==xxnum[0].xxsum)
		{
			if(xxnum[l].count>xxnum[0].count)
			xxnum[0].count=xxnum[l].count;
		}
	}
	
	printf("%d",xxnum[0].count);
	return 0;
}
int sum(int x)
{
	xsum=0;
	i=0;
	while(x>0){
	xcount[i]=x%10;
	i++;
	x=x/10;
	}
	
	for(j=0;j<i;j++){
		xsum=xsum+xcount[j];
	}
	
	return xsum;
}

日期计算

标题
日期计算

类别
流程控制

时间限制
1S

内存限制
256Kb

问题描述
给定一个年份y和一个整数d,问这一年的第d天是几月几日?
注意闰年的2月有29天,且满足下面条件之一的是闰年:
1) 年份是4的整数倍,而且不是100的整数倍;
2) 年份是400的整数倍

输入说明
输入包含两个整数y和d,y表示年份,年份在1900到2018之间(包含1900和2018)。 d表示这一年的第几天,d在1至365之间。

输出说明
在一行输出两个整数,分别表示答案的月份和日期。

输入样例
2015 80

输出样例
3 21

//由此可见,代码不是越长越好,只是我懒罢了,估计哪一天半夜迷迷糊糊地写的,哈哈哈哈,对自己充满嫌弃,像傻子一样
//下面公开处刑
#include<stdio.h>
int main()
{
	int year,day;
	
	scanf("%d%d",&year,&day);
	
	if(year%100!=0&&year%4==0||year%400==0)
	{
		if(day<31)
		printf("1 %d",day);
		else if(day>31&&(day-31)<=29)
		printf("2 %d",day-31);
		else if(day>(31+29)&&(day-31-29)<=31)
		printf("3 %d",day-31-29);
		else if(day>(31+29+31)&&(day-31-29-31)<=30)
		printf("4 %d",day-31-29-31);
		else if(day>(31+29+31+30)&&(day-31-29-31-30)<=31)
		printf("5 %d",day-31-29-31-30);
		else if(day>(31+29+31+30+31)&&(day-31-29-31-30-31)<=30)
		printf("6 %d",day-31-29-31-30-31);
		else if(day>(31+29+31+30+31-30)&&(day-31-29-31-30-31-30)<=31)
		printf("7 %d",day-31-29-31-30-31-30);
		else if(day>(31+29+31+30+31-30-31)&&(day-31-29-31-30-31-30-31)<=31)
		printf("8 %d",day-31-29-31-30-31-30-31);
		else if(day>(31+29+31+30+31-30-31-31)&&(day-31-29-31-30-31-30-31-31)<=30)
		printf("9 %d",day-31-29-31-30-31-30-31-31);
		else if(day>(31+29+31+30+31-30-31-31-30)&&(day-31-29-31-30-31-30-31-31-30)<=31)
		printf("10 %d",day-31-29-31-30-31-30-31-31-30);
		else if(day>(31+29+31+30+31-30-31-31-30-31)&&(day-31-29-31-30-31-30-31-31-30-31)<=30)
		printf("11 %d",day-31-29-31-30-31-30-31-31-30-31);
		else if(day>(31+29+31+30+31-30-31-31-30-31-30)&&(day-31-29-31-30-31-30-31-31-30-31-30)<=31)
		printf("12 %d",day-31-29-31-30-31-30-31-31-30-31-30);
	}
	else 
	{
		if(day<31)
		printf("1 %d",day);
		else if(day>31&&(day-31)<=28)
		printf("2 %d",day-31);
		else if(day>(31+28)&&(day-31-28)<=31)
		printf("3 %d",day-31-28);
		else if(day>(31+28+31)&&(day-31-28-31)<=30)
		printf("4 %d",day-31-28-31);
		else if(day>(31+28+31+30)&&(day-31-28-31-30)<=31)
		printf("5 %d",day-31-28-31-30);
		else if(day>(31+28+31+30+31)&&(day-31-28-31-30-31)<=30)
		printf("6 %d",day-31-28-31-30-31);
		else if(day>(31+28+31+30+31-30)&&(day-31-28-31-30-31-30)<=31)
		printf("7 %d",day-31-28-31-30-31-30);
		else if(day>(31+28+31+30+31-30-31)&&(day-31-28-31-30-31-30-31)<=31)
		printf("8 %d",day-31-28-31-30-31-30-31);
		else if(day>(31+28+31+30+31-30-31-31)&&(day-31-28-31-30-31-30-31-31)<=30)
		printf("9 %d",day-31-28-31-30-31-30-31-31);
		else if(day>(31+28+31+30+31-30-31-31-30)&&(day-31-28-31-30-31-30-31-31-30)<=31)
		printf("10 %d",day-31-28-31-30-31-30-31-31-30);
		else if(day>(31+28+31+30+31-30-31-31-30-31)&&(day-31-28-31-30-31-30-31-31-30-31)<=30)
		printf("11 %d",day-31-28-31-30-31-30-31-31-30-31);
		else if(day>(31+28+31+30+31-30-31-31-30-31-30)&&(day-31-28-31-30-31-30-31-31-30-31-30)<=31)
		printf("12 %d",day-31-28-31-30-31-30-31-31-30-31-30);
	}
 } 
//这是后面写的,这道题目同样收录在C语言集合练习之流程控制里面,只是换了一个标题。
#include<stdio.h>
int main()
{
	int a[2][12]={{31,29,31,30,31,30,31,31,30,31,30,31},{31,28,31,30,31,30,31,31,30,31,30,31}};
	int y=0,d=0,j=0,i=0;
	scanf("%d%d",&y,&d);
	if((y%4==0&&y%100!=0)||y%400==0)
		i=0;
	else
		i=1;
	for(j=0;d>0;j++)
	d=d-a[i][j];
	printf("%d %d",j,d+a[i][j-1]);//计算出日期
	return 0;
}

统计正整数的个数

标题
统计正整数的个数

类别
流程控制

时间限制
1S

内存限制
1000Kb

问题描述
统计n个正整数中每个数出现的次数。

输入说明
第一行是一个整数n(5<n<30),表示要待统计整数的个数;
第二行是n个整数,每个整数均小于100000

输出说明
按照整数从小到大的顺序依次输出不同的整数及其出现次数,整数和出现次数之间用冒号(:)分隔。

输入样例
12
19 223 35 321 2 33 44 223 2 19 2 19

输出样例

2:3
19:3
33:1
35:1
44:1
223:2
321:1

#include<stdio.h>
int main()
{
	int count,num[30],xnum[30];
	int xxnum[30],xcount[30];
	int i,j,l,k;
	
	scanf("%d",&count);
	for(i=0;i<count;i++)
	scanf("%d",&num[i]);
	
	for(i=0;i<count;i++)
	xnum[i]=1;	

	for(i=0;i<count-1;i++)
	for(j=i+1;j<count;j++){
		if(num[i]==num[j]){
			xnum[j]=xnum[i]+1;
			xnum[i]=0;
			break;
		}
	}
	
	j=0;
	for(i=0;i<count;i++){
		if(xnum[i]!=0){
			xxnum[j]=num[i];
			xcount[j]=xnum[i];
			j++;
		}
	}
	
	for(i=0;i<j-1;i++)
	for(k=i;k<j;k++)
	if(xxnum[i]>xxnum[k]){
		l=xxnum[i];
		xxnum[i]=xxnum[k];
		xxnum[k]=l;
		l=xcount[i];
		xcount[i]=xcount[k];
		xcount[k]=l;
	}
	
	for(i=0;i<j;i++)
	printf("%d:%d\n",xxnum[i],xcount[i]);
	
	return 0;
}

跳一跳

标题
跳一跳

类别
流程控制

时间限制
1S

内存限制
256Kb

问题描述
跳一跳是一款微信小游戏,游戏规则非常简单,只需玩家要从一个方块跳到下一个方块,如果未能成功跳到下一个方块则游戏结束。
计分规则如下:

  1. 如果成功跳到下一个方块上,但未跳到方块中心,加1分
  2. 如果成功跳到下一个方块上,且刚好跳到方块中心,则第一次加2分,此后连续跳到中心时每次递增2分。也就是说,第一次跳到方块中心加2分,连续第二次跳到方块中心加4分,连续第三次跳到方块中心加6分,…,以此类推。
  3. 如果未能成功跳到方块上,加0分,且游戏结束
    现在给出玩家一局游戏的每次跳跃情况,请计算玩家最终得分。

输入说明
输入为若干个非零整数(整数个数小于1000),表示玩家每次的跳跃情况。整数之间用空格分隔,整数取值为0,1,2。
0 表示未能成功跳到下一个方块上,
1 表示成功跳到下一个方块上但未跳到方块中心,
2 表示成功跳到下一个方块上,且刚好跳到方块中心。
输入的数据只有最后一个整数是0,其余均非零。

输出说明
输出一个整数表示该玩家的最终得分。

输入样例
1 1 2 1 2 2 2 0

输出样例
17

#include<stdio.h>
#include<math.h>
int main()
{
	int num[1000];
	int sum=0;
	int i,j,k,l;
	int count[2]={0,0};
	int flag,xflag=0;
	
	i=0;
	
	while(1){
		scanf("%d",&num[i]);
		if(num[i]==0){
		break;
		}
		i++;
	}
	
	for(j=0;j<i+1;j++)
	if(num[j]==1)
	count[0]++;

	for(j=0;j<i+1;j++){
		if(num[j]==2){
			count[1]++;
			flag=1;
			xflag=1;
		}
		else {
			if(xflag==1)
			flag=0;
			else 
			flag=2;
		}
		if(flag==0){
			sum=sum+(2+2*count[1])*count[1]/2;
			count[1]=0;
			xflag=0;
		}
		
	}
	
	printf("%d",sum+count[0]);
	
	return 0;
}

数值数位之和–多位数拆分练习

标题
数位数值之和

描述
输入一个四位正整数,分解出各个数位数值,求各个数位数值之和,并输出各个数位数值及其和。

时间限制
1

内存限制
10000

类别
1

输入说明
输入四位正整数N,如1234

输出说明
输出各个数位及其和,各个结果之间空一个空格

输入样例
1234

输出样例
1 2 3 4 10

提示
采用while循环结构,定义子函数sum(),实现数值数位拆分、求和以及输出功能;
主函数调用,输入:如1234,输出:1 2 3 4 10

#include<stdio.h>
void sum(int i);
int main()
{
	
	int num;
	scanf("%d",&num);
	sum(num);
	return 0;
 } 
void sum(int i)
{
	int j[4],k,l;
	k=0;
	l=0;
	while(i>0){
		j[k]=i%10;
		k++;
		//printf("%d",i%10);
		i=i/10;
	}
	for(k=3;k>=0;k--){
		printf("%d ",j[k]);
		l=l+j[k];
	}
	printf("%d",l);
}

小球下落问题

题目:小球下落问题
时间限制:1S
内存限制:10000Kb
问题描述:
一个球从100m的高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。求它在第n次落地时,共经过多少米,第n次反弹多高。注:
输入说明:
输入一个整数,表示第n次落地反弹。
输出说明:
输出两个浮点数,表示小球经过的距离,和第n次反弹的高度,小数点后保留3位小数。
输入样例:
10
输出样例:
S=299.609 h=0.098

#include<stdio.h>
#include<math.h>
 int main()
 {
 	int n;
 	double S,h;
 	scanf("%d",&n);
 	h=100.0*pow(0.5,n);
 	S=300.0-100.0*pow(0.5,n-2);
 	printf("S=%.3f h=%.3f",S,h);
 	return 0;
 }

输出金字塔

题目描述:输出金字塔

请输入一个大写字母作为字母金字塔的最大字母

示例:
输入:C
输出: A
ABA
ABCBA (最后一行开头无空格)

#include<stdio.h>
int main()
 {
 	char i,j,k,b;
 	scanf("%c",&b);
 	for(i = 65; i <= b ; i++)			//第一个循环,行数
		{
			for (j = b-i ; j >= 0 ; j-- )		//第二个循环,填充空格
			{
				printf(" ");
			}
			for(k = 65 ; k <= i ;k++)			//第三个循环,输出正序
			{
				printf("%c",k);
			}
			for(k=i-1 ; k >= 65  ; k--)			//第四个循环,输出反序
			{
				printf("%c",k);
			}
			printf("\n");
		}
		return 0;
	}

位数判断

problem 3-6. 位数判断
题目描述:
输入一个不大于9位数的非负整数m,判断m是几位数?
输入说明:
输入为一个整数m,范围0<=m<=999999999
输出说明:
输出一个整数,表示整数m的位数

输入样例:
3456
输出样例:
4

#include<stdio.h>
void sum(int i);
int main()
{
	
	int num;
	scanf("%d",&num);
	if(num==0)
	printf("1");
	else
	sum(num);
	return 0;
 } 
void sum(int i)
{
	int k;
	k=0;
	while(i>0){
		k++;
		i=i/10;
	}
	printf("%d",k);
}

回文数

标题
回文数

类别
数组

时间限制
2S

内存限制
1000Kb

问题描述
若一个非负整数其各位数字按照正反顺序读完全相同,则称之为回文数,例如12321。
判断输入的整数是否是回文数。若是,则输出该整数各位数字之和,否则输出no。

输入说明
输入为一个整数n,0<=n<1000000000。

输出说明
若该整数为回文数,则输出整数各位数字之和,否则输出no。

输入样例
样例1输入
131
样例2输入
24

输出样例
样例1输出
5
样例2输出
no

#include<stdio.h>
int main()
{
	long n,middle;
	int number[10],digit=0,r,sum=0;
	scanf("%ld",&n);
	middle=n;
	while(middle)
	{
		r=middle%10;
		middle=middle/10;
		number[digit]=r;
		digit+=1;
	}
	//printf("%d\n",digit);
	if(n<10)
	printf("%d",n);
	else{
	for(int i=0;i<=digit/2-1;i++)
	{
		if(i==digit/2-1)
		{
			if(number[i]==number[digit-1-i])
			{if(digit%2==0)
				{
				sum=sum+number[i]+number[digit-1-i];
				printf("%d",sum);
				break;}
			 if(digit%2!=0)
				{
				sum=sum+number[i]+number[digit-1-i]+number[i+1];
				printf("%d",sum);
				break;
			}
		}}
		if(number[i]==number[digit-1-i])
		{
			sum=sum+number[i]+number[digit-1-i];
		continue;}
		if(number[i]!=number[digit-1-i])
		{
			printf("no");
			break;
		}
	}}
	return 0;
}

0-1矩阵

标题
0-1矩阵

类别
数组

时间限制
2S

内存限制
1000Kb

问题描述
查找一个只包含0和1的矩阵中每行最长的连续1序列。

输入说明
输入第一行为两个整数m和n(0<=m,n<=100)表示二维数组行数和列数,其后为m行数据,每行n个整数(0或1),输入数据中不会出现同一行有两个最长1序列的情况。

输出说明
找出每一行最长的连续1序列,输出其起始位置(从0开始计算)和结束位置(从0开始计算),如果这一行没有1则输出两个-1,然后换行。

输入样例
5 6
1 0 0 1 1 0
0 0 0 0 0 0
1 1 1 1 1 1
1 1 1 0 1 1
0 0 1 1 0 0

输出样例
3 4
-1 -1
0 5
0 2
2 3

#include<stdio.h>
int main()
{
	int m,n,a[100][100];
	int i,j,sum=0,max=0,maxi,maxj;
	scanf("%d%d",&m,&n);
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			if(a[i][j]==1)
			{
				
				sum++;
				if(sum>max)
				{
					max=sum;
					maxj=j;
					maxi=j-max+1;
				}
				
			}
			else{
				sum=0;
			}
		}
		if(max>0)
				printf("%d %d\n",maxi,maxj);
			else
				printf("-1 -1\n");
			sum=0;max=0;maxi=0;maxj=0;
	}
	return 0;
}

相邻区域

标题
相邻区域

类别
数组

时间限制
1S

内存限制
256Kb

问题描述
一个n行m列的矩阵被划分成t个矩形区域,分别用数字1-t来标识,同一个区域内的元素都用同一个数字标识。如下图所示,一个6行8列的矩阵被分成8个矩形区域,分别用编号1-8标识。当两个小区域之间公用一条边时,称这两个区域相邻,例如下图中区域5的相邻区域有6个,分别为1,2,3,6,7,8,但4并不是它的相邻区域。请写一个程序找出区域k的所有相邻区域。

输入说明
输入第一行为四个整数n,m, t,k,整数之间用空格分隔。n表示矩阵行数(n<20),m表示矩阵列数(m<20),t表示矩阵被划分为t个矩形区域(0<t<50),k为其中某个区域的编号(1<=k<=t)。接下来是n行数据,每行m个整数,表示矩阵内各个元素所在的区域,整数之间用空格分隔。

输出说明
输出为一个整数,表示与k相邻的区域个数

输入样例
6 8 8 5
1 1 2 2 2 3 3 4
1 1 2 2 2 3 3 4
1 1 2 2 2 3 3 4
1 1 5 5 5 5 5 6
1 1 5 5 5 5 5 6
7 7 7 7 7 8 8 8

输出样例
6

//这个题目比较好玩,有难度
#include<stdio.h>
int main(void){
	int array[20][20];
	int flag[50]={0}; 
	int n,m,t,k;
	int i,j,count,iStart,iEnd,jStart,jEnd;
	scanf("%d%d%d%d",&n,&m,&t,&k);
	//输入 
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			scanf("%d",&array[i][j]);
		}
	}
	//判断编号k的范围
	 iStart=iEnd=jStart=jEnd=-1;
	 for(i=0;i<n;i++){
	 	for(j=0;j<m;j++){
	 		if(array[i][j]==k){
	 			if(iStart==-1&&jStart==-1){
	 				iStart=i;
	 				jStart=j;
				 }
				if(iEnd<i){
					iEnd=i;
				}
				if(jEnd<j){
					jEnd=j;
				}
			}
		 }
	 }
	 //判断左右两边 
	 count=0;
	 for(i=iStart;i<=iEnd;i++){
	 	if(jStart>0){//左边有编号 
	 		if(flag[array[i][jStart-1]]==0){
	 			count++;
	 			flag[array[i][jStart-1]]=1;
			 }
		}
		if(jEnd<m-1){
			if(flag[array[i][jEnd+1]]==0){
				count++;
				flag[array[i][jEnd+1]]=1;
			}
		}
	 }
	 //判断上下
	 for(j=jStart;j<=jEnd;j++){
	 	if(iStart>0){
	 		if(flag[array[iStart-1][j]]==0){
	 			count++;
	 			flag[array[iStart-1][j]]=1;
			}
		 }
		 if(iEnd<n-1){
		 	if(flag[array[iEnd+1][j]]==0){
		 		count++;
		 		flag[array[iEnd+1][j]]=1;
			 }
		 }
	
	 }	
	 printf("%d",count);
	return 0;
} 

灰度直方图

标题
灰度直方图

类别
数组

时间限制
2S

内存限制
1000Kb

问题描述
一幅m×n的灰度图像可以用一个二维矩阵表示,矩阵中的每个元素表示对应像素的灰度值。
灰度直方图表示图像中具有每种灰度级的象素的个数,反映图像中每种灰度出现的频率。
假设图像灰度为16级(灰度值从0-15),现给出一个矩阵表示的灰度图像,输出各级灰度的像素个数。

输入说明
输入数据第一行为两个整数m 和n分别表示图像的宽度和高度(0<=m,n<=256),其后是n行数据,每行m个整数,分别表示图像各个像素的灰度值。

输出说明
输出n行数据,每行数据由两个整数组成,分别表示灰度级和该灰度级像素个数,整数之间用空格分隔,灰度级输出顺序为从低到高,
如果某灰度级像素个数为0,则不输出该灰度级的统计结果。

输入样例
5 4
0 1 0 2 8
3 4 8 5 9
12 14 10 6 7
1 15 3 6 10

输出样例
0 2
1 2
2 1
3 2
4 1
5 1
6 2
7 1
8 2
9 1
10 2
12 1
14 1
15 1

#include<stdio.h>
int main()
{
	int a[256][256],b[16]={0},m,n,i,j,l;
	scanf("%d%d",&m,&n);
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			scanf("%d",&a[i][j]);
			switch(a[i][j])
			{
				case 0:b[0]=b[0]+1;break;
				case 1:b[1]=b[1]+1;break;
				case 2:b[2]=b[2]+1;break;
				case 3:b[3]=b[3]+1;break;
				case 4:b[4]=b[4]+1;break;
				case 5:b[5]=b[5]+1;break;
				case 6:b[6]=b[6]+1;break;
				case 7:b[7]=b[7]+1;break;
				case 8:b[8]=b[8]+1;break;
				case 9:b[9]=b[9]+1;break;
				case 10:b[10]=b[10]+1;break;
				case 11:b[11]=b[11]+1;break;
				case 12:b[12]=b[12]+1;break;
				case 13:b[13]=b[13]+1;break;
				case 14:b[14]=b[14]+1;break;
				case 15:b[15]=b[15]+1;break;
			}
		}
	}
	for(l=0;l<16;l++)
	{
		if(b[l]==0) continue;
		else printf("%d %d\n",l,b[l]);
	}	
	return 0;
 } 

密码强度

标题
密码强度

类别
字符串处理

时间限制
1S

内存限制
256Kb

问题描述
每个人都有很多密码,你知道你的密码强度吗?假定密码由大写字母、小写字母、数字和非字母数字的符号这四类字符构成,密码强度计算规则如下:

  1. 基础分:空密码(密码长度为零)0分,非空密码1分
  2. 加分项1:密码长度超过8位,+1分
  3. 加分项2:密码包含两类不同字符+1分,包含三类不同字符+2分,包含四类不同字符+3分
    按照此规则计算的密码强度为0~5。请你设计一个程序计算给出的密码的强度。

输入说明
输入为一个密码字符串,字符串长度不超过50个字符。

输出说明
输出一个整数表示该密码的强度。

输入样例
输入样例1
abcd
输入样例2
ab123

输出样例
样例1输出:
1
样例2输出
2

#include<stdio.h>
#include<string.h>
int main()
{
	int count=0,x,count1=0;
	char ch[50];
	gets(ch);
	//printf("%s",ch);
	 x=strlen(ch);
	 if(x==0)
	 count=0;
	 if(x!=0)
	 count+=1;
	 if(x>8)
	 count+=1;
	  for(int i=0;i<x;i++)
	  {
	  	if(ch[i]>='0'&&ch[i]<='9')
	  	{
	  		count1=1+count1;
	  		break;
		  }
	  }
	  for(int i=0;i<x;i++)
	  {
	  	if(ch[i]>='a'&&ch[i]<='z')
	  	{
	  		count1+=1;
	  		break;
		  }
	  }
	  for(int i=0;i<x;i++)
	  {
	  	if(ch[i]>='A'&&ch[i]<='Z')
	  	{
	  		count1+=1;
	  		break;
		  }
	  }
	  for(int i=0;i<x;i++)
	  {
	  	if(ch[i]<'0'||ch[i]>'9'&&ch[i]<'A'||ch[i]>'Z'&&ch[i]<'a'||ch[i]>'z')
	  	{
	  		count1+=1;
	  		break;
		  }  
	  }
	  for(int i=1;i<count1;i++)
	  count+=1;
	  printf("%d",count);
	  return 0;
 } 

图像旋转

标题	

图像旋转

类别
数组

时间限制
1S

内存限制
256Kb

问题描述
旋转是图像处理的基本操作,在这个问题中,你需要将一个图像顺时针旋转90度。
计算机中的图像可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。例如,下面的矩阵(a)表示原始图像,矩阵(b)表示顺时针旋转90度后的图像。
在这里插入图片描述

输入说明
输入的第一行包含两个整数n和m,分别表示图像矩阵的行数和列数。1 ≤ n, m ≤ 100。
接下来n行,每行包含m个非负整数,表示输入的图像,整数之间用空格分隔。

输出说明
输出m行,每行n个整数,表示顺时针旋转90度之后的矩阵,元素之间用空格分隔。

输入样例
2 3
1 5 3
3 2 4

输出样例
3 1
2 5
4 3

#include<stdio.h>
int main()
{
	int m,n,i,j,a[100][100],b[100][100];
	scanf("%d %d",&m,&n);
	for(i=0;i<m;i++)//控制a【】的行数
	for(j=0;j<n;j++)//控制列数
	{
		scanf("%d",&a[i][j]);
		b[j][i]=a[i][j]; 
	}
	for(j=0;j<n;j++)
	for(i=m-1;i>=0;i--)
	{ 
		printf("%d ",b[j][i]);
		if(i==0)
		printf("\n");
	 } 
	 return 0;
}

画图

标题
画图

类别
数组

时间限制
1S

内存限制
256Kb

问题描述
在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形,指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。
下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。
在这里插入图片描述

图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形 都涂成统一的颜色,图中显示不同颜色仅为说明方便。给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。

输入说明
输入的第一行包含一个整数n,表示要画的矩形的个数,1<=n<=100
接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。0<=横坐标、纵坐标<=100。

输出说明
输出一个整数,表示有多少个单位的面积被涂上颜色。

输入样例
2
1 1 4 4
2 3 6 5

输出样例
15

#include <stdio.h>

int main()
{   int area[101][101];
	int n,i,j,k;
	int ans=0;
	int x1, y1, x2, y2;
		for( i = 0; i< 101; i++)
			for( j = 0; j< 101; j++)
			{area[i][j]=0;
			}
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d %d %d %d",&x1,&y1,&x2,&y2);//网格坐标 
		for(j=x1;j<x2;j++)
			for(k=y1;k<y2;k++)
			{
				area[j][k]=1;
			}			
	}
	for( i = 0; i< 101; i++)
		for( j = 0; j< 101; j++)
			if(area[i][j]==1)
			{
				ans++;
//				printf("%d %d\n",i,j);
			}
	printf("%d",ans);
	return 0;
} 

密码编译

题目:密码编译
时间限制:1S
内存限制:10000Kb

问题描述:
有一行电文,已按照下面的规律译成密码:
A>>Z a>>z
B>>Y b>>y
C>>X c>>x
. .
. .
. .
等等。即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变,要求编程序将密码译成原文。
输入说明:
输入一串字符(包含7个元素),表示密码。
输出说明:
输出其对应的字符(包含7个元素),表示原文。
输入样例:
ABCDEFG
输出样例:
ZYXWVUT

#include<stdio.h>
int main()
{char a[7],c;
    int i,j;
 	gets(a);
 	for(i=0;(c=a[i])!='\0';i++)
	 	{if(c>='A'&&c<='Z')
		 {
		     a[i]='A'+'Z'-a[i];
	     } 
		 else if(c>='a'&&c<='z')
		 { a[i]='a'+'z'-a[i];
		 }
		}
		puts(a);
		return 0;
}

数组逆序排列

题目:数组逆序排列
时间限制:1S
内存限制:10000Kb

问题描述
将一个包含5个元素的数组逆序排列。
输入说明:
输入一个数组(包含5个元素),元素之间用逗号隔开。
输出说明:
输出一个数组(包含5个元素),元素之间用空格隔开。
输入样例:
8,6,5,4,1
输出样例:
1 4 5 6 8

#include "stdio.h"
#define N 5 
int main() 
{ 
	int a[N]; 
	int i;
	for(i=0;i<N-1;i++)
		scanf("%d,",&a[i]);
		scanf("%d",&a[4]);

	for(i=4;i>=0;i--)
	printf("%d ",a[i]); 

	return 0;
}

数组元素平移

题目描述:
已知数组array[10]={1,2,3,4,5,6,7,8,9,10};要求把下标从0到p(p从键盘输入)的数组元素平移到数组的最后,并输出平移后的数组。

输入格式:输入一个整数p;
输出格式:共一行,输出平移后的数组,数字之间用空格分隔

示例:
输入:3
输出:5 6 7 8 9 10 1 2 3 4

#include <stdio.h>
int main()
{
	int array[10] = {1,2,3,4,5,6,7,8,9,10};
	int n;
	scanf("%d", &n);
	int q[10], i, j = 0;
	for(i = n + 1; i < 10; i ++)
	{
		q[j] = array[i];
		j++;
	}
	for(i = 0; i <= n; i ++)
	{
		q[j] = array[i];
		j++;
	}
	for(i = 0; i < 10; i ++)
	{
		printf("%d ", q[i]);
	}
	return 0;
		
} 

后项除以前项

题目描述:
数组a包括10个整数,把a中所有的后项除以前项之商取整后存入数组b。

输入格式:共一行,输入数组a中的所有值;
输出格式:共一行,输出数组b中的值,以空格分隔。

示例:
输入:1 2 5 15 60 70 30 90 100 200
输出:2 2 3 4 1 0 3 1 2

#include <stdio.h>
int main()
{
	int a[10];
	for(int d=0;d<10;d++)
	scanf("%d",&a[d]);
	
		int b[9]={0},i=0,j=0;

		for(i=1;i<=9;i++){
			b[j]=a[i]/a[i-1];
			printf("%d ",b[j]);
			j++;
		}
	return 0;
		
} 

单词排序–字符数组练习

标题
单词排序

描述
定义一个二维字符数组str[10][20],行号表示单词序号,列号表示单词最大长度,输入一个正整数N(N≤10),表示单词数,使用函数wd_sort()完成单词的排序,按字母顺序从小到大排列单词,使用指针完成地址传递,主函数完成数组输入和输出。

时间限制
1

内存限制
10000

类别
1

输入说明
输入一个二维字符数组str和一个正整数N,行号表示单词序号,列号表示单词最大长度。

输出说明
格式输出:单词之间空一行。

输入样例
3
word fish egg
输出样例
egg
fish
word

提示
使用指针作形参,实现地址传递。
数组定义后初始化。
使用strcmp()、strcpy()和strlen()函数,头文件string.h。

#include "stdio.h"
#include "string.h"
void wd_sort(char (*p)[20],int n);
int main(){
	char str[10][20];
	int N;
	int i,j;
	scanf("%d",&N);
	for(i=0;i<N;i++)
		scanf("%s",str[i]);
	wd_sort(str,N);
	for(i=0;i<N;i++){
		printf("%s\n",str[i]);
	} 
	
	return 0;			
}
void wd_sort(char (*p)[20],int n){
	int i,j;
	char s[20];
	for(i=1;i<n;i++){
		for(j=i;j>0&&(strcmp(*(p+j),*(p+j-1))<0);j--){
			strcpy(s,*(p+j));
			strcpy(*(p+j),*(p+j-1));
			strcpy(*(p+j-1),s);
		}
	}
//	for(i=0;i<n;i++){
//		printf("%s\n",p+i);
//	} 
}

字符拷贝–字符数组练习

标题
字符拷贝

描述
定义一个一维字符数组str[50],输入一串字符,输入整数位置信息M(M<50),调用函数char_cp()把指定位置M之后的内容,拷贝到新字符数组ch[50]中,使用指针完成地址传递,主函数完成数组输入和输出。

时间限制
1

内存限制
10000

类别
1

输入说明
输入一个字符串和整形位置信息,位置M≥0。

输出说明
格式输出:输出处理后字符串ch。

输入样例
There are three men.
6

输出样例
re three men.

提示
使用指针作形参,实现地址传递,位置从0开始。

//单纯从写作业最快的角度,毕竟那个破系统也不会较真不是
#include <stdio.h>
#include <string.h>
int main() 
{
	int n, len, i;
	char str[50];
	gets(str);
	scanf("%d", &n);
	len = strlen(str);
	for (i = n + 1; i < len; i++) {
		printf("%c", str[i]);
	}
	return 0;
}
//从提升自己的角度来说,就得规规矩矩,老实完成要求
#include "stdio.h"
#include "string.h"
void char_cp(char *p,char *q,int n);
int main(){
	char str[50],ch[50];
	int m;
	gets(str);
	scanf("%d",&m);
	char_cp(str,ch,m);
	
	printf("%s",ch);
	return 0;
}
void char_cp(char *p,char *q,int n){
	int i,len;
	len=strlen(p);

	for (i = n + 1; i < len; i++) {
		*(q++)=*(p+i);
	}
}

寻找最长的行

标题
寻找最长的行

类别
字符串

时间限制
1S

内存限制
1000Kb

问题描述
寻找若干行文本中最长的一行

输入说明
输入为多个字符串(每个字符串长度不超过100个字符),每个字符串占一行,输入的行为“ * * * end * * * ”(*之间没有空格,收到文本编译器限制,目前我打不出没有空格的连续三个星号)时表示输入结束

输出说明
输出其中最长的一行长度后换行再输出最长行的内容,如果最长行不止一个,则输出其中的第一行。

输入样例
abce
abdf dlfd
* * * end * * *

输出样例
9
abdf dlfd

#include <string.h>
#include <stdio.h>
int main()
{
    char s[200],s1[200];
 	int n,max=0;
 	while(1)
 {
        gets(s);
  		if(strcmp(s,"***end***")==0)
   			 break;
  		n=strlen(s);
  		if(n>max)
  		{
            max=n;strcpy(s1,s);
  		}

}
 printf("%d\n%s\n",max,s1);
 return 0;
}

括号匹配

标题
括号匹配

类别
字符串处理

时间限制
2S
内存限制
1000Kb

问题描述
表达式中的合法括号为“(”、“)”、“[”、“]”、“{”、“}”,这三种括号可以按照任意的次序嵌套使用。
请写一个程序,判断给定表达式中的括号是否匹配,既左右括号顺序和数量都匹配。

输入说明
输入为一个表达式字符串,长度不超过50。

输出说明
对输入的表达式,若其中的括号是匹配的,则输出“yes”,否则输出“no”。

输入样例
样例1输入
[(d+f)*{}2]
样例2输入
[(2+3))

输出样例
样例1输出
yes
样例2输出
no

#include<stdio.h>
#include<string.h>
int main()
{
	int a=0,b=0,c=0,i,flag=0;
	char str[55];
	scanf("%s",str);
	for(i=0;i<strlen(str);i++)
	{
		if(str[i]=='(') a++;
		else if (str[i]=='[') b++;
		else if (str[i]=='{') c++;
		else if (str[i]==')')
		{
			a--;
			if(a<0){flag=1;break;}
		}
		else if (str[i]==']')
		{
			b--;
			if(b<0){flag=1;break;}
		}
		else if (str[i]=='}')
		{
			c--;
			if(c<0){flag=1;break;}
		}
		if(flag==1) break;
	}
	if(flag==1) printf("no");
	else if(flag==0&&a==0&&b==0&&c==0)
	printf("yes");
	else
	printf("no");
	
}

表达式求值

标题
表达式求值

类别
字符串处理

时间限制
1S

内存限制
256Kb

问题描述
表达式由两个非负整数x,y和一个运算符op构成,求表达式的值。
这两个整数和运算符的顺序是随机的,可能是”x op y”, “op x y”或者 “x y op”,例如,“25 + 3”表示25加3,“5 30 *” 表示5乘以30,“/ 600 15”表示600除以15。

输入说明
输入为一个表达式,表达式由两个非负整数x,y和一个运算符op构成,x,y和op之间以空格分隔,但顺序不确定。
x和y均不大于10000000,op可以是+,-,*,/,%中的任意一种,分表表示加法,减法,乘法,除法和求余。
除法按整数除法求值,输入数据保证除法和求余运算的y值不为0。

输出说明
输出表达式的值。

输入样例
样例1输入
5 20 *
样例2输入
4 + 8
样例3输入
/ 8 4

输出样例
样例1输出
100
样例2输出
12
样例3输出
2

#include<stdio.h>
#include<string.h>
int main()
{
	int i,k,sum2,sum1,n=0,flag=0;
	char s[19];
	gets(s);
	for(i=0;i<strlen(s);i++)
	{
		if(s[i]>='0'&&s[i]<='9')
		{
			n=n*10+(s[i]-48);
			if(i==strlen(s)-1)
			sum2=n;
			else
			if((s[i+1]<'0')||(s[i+1]>'9'))
			{
				if(flag==0)
				{
					sum1=n;
					n=0;
					flag=1;	
				}
				else sum2=n;
			}
		}
		else continue;
	}
	for(i=0;i<strlen(s);i++)
	{
		if((s[i]<'0')||(s[i]>'9')&&s[i]!=32)
		{
			if(s[i]=='+') k=sum1+sum2;
			else if(s[i]=='-') k=sum1-sum2;
			else if(s[i]=='*') k=sum1*sum2;
			else if(s[i]=='/') k=sum1/sum2;
			else if(s[i]=='%') k=sum1%sum2;
		}
	}
	printf("%d",k);
	return 0;
 } 

字符串查找

标题
字符串查找

类别
字符串处理

时间限制
2S

内存限制
256Kb

问题描述
给出一个字符串和多行文字,输出在这些文字中出现了指定字符串的行。
程序还需要支持大小写敏感选项:
当选项打开时,表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

输入说明
输入数据第一行包含一个字符串s,由大小写英文字母组成,长度不超过100。
第二行包含一个数字,表示大小写敏感选项。当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。每个字符串长度不超过100。

输出说明
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串s的行。

输入样例
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

输出样例
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello

//此篇代码为转载,比我提交的写的好,同学找我分析时看见,就直接给出来,若原创要求删除,请与我联系
#include <stdio.h>
#include <string.h>

#define WORD 1
#define LETTER -1

int main()
{
    char word[101];
    gets(word);
    int sensi; //sensitivity(敏感),这正是此题的特殊之处之一
    int n;
    scanf("%d%d",&sensi,&n);
    getchar();
    if(!sensi)strupr(word); //若sensi等于0,则大小写不敏感,把字符数组word中的字符全部转变为大写
    char str[101][101],str1[101];   /*字符数组str1的存在是为了保证字符数组str的内容不变
                                    因为最后输出的必须是原字符串*/
    int i=0,j;
    for(;i<n;++i)
    {
        gets(str[i]);
    }
    int state=LETTER;
    int len=strlen(word);
    for(i=0;i<n;++i)
    {
        strcpy(str1,str[i]);
        if(!sensi)
        {
            strupr(str1);   //如果大小写不敏感,那么这样做能避免改变字符数组str的内容
        }
        int done=0; /*这也是此题的特殊之处之一,不需要统计单词出现了多少次,只需要根据情况输出这一行字符串,
                    done用于判断这一行字符串是否已经被输出*/
        for(j=0;str1[j];++j)
        {
//            printf("J:%d STATE:%d\n",j,state);
            switch(state)
            {
            case(LETTER):
                if(str1[j]==word[0])state=WORD;
                break;
            default:
                if(state<len)
                {
                    if(str1[j]==word[state])++state;
                    else
                    {
                        j-=state;   /*这也是此题的特殊之处之一
                                    对于某些特殊样例,必须这样做*/
                        state=LETTER;   //状态不要忘记改变
                    }
                }
                else if(state==len)
                {
                    printf("%s\n",str[i]);  //如果大小写不敏感,那么字符数组str1中的字母全为大写,因此应该输出str[i]
                    done=1; 
                    state=LETTER;
                }
            }
            if(done)break;  //如果这一行字符串是否已经被输出,那么done等于1,break,不需要再管剩下的字符
        }
        if(state==len&&!done)   //如果这一行字符串是否已经被输出,那么done等于1,不需要再输出
        {
            printf("%s\n",str[i]);
            state=LETTER;
        }
    }
    return 0;
}

目录操作

标题
目录操作

类别
字符串处理

时间限制
1S

内存限制
256Kb

问题描述
在操作系统中,文件系统一般采用层次化的组织形式,由目录(或者文件夹)和文件构成,形成一棵树的形状。
有一个特殊的目录被称为根目录,是整个文件系统形成的这棵树的根节点,在类Linux系统中用一个单独的 “/”符号表示。
因此一个目录的绝对路径可以表示为“/d2/d3”这样的形式。
当前目录表示用户目前正在工作的目录。为了切换到文件系统中的某个目录,可以使用“cd”命令。
假设当前目录为“/d2/d3”,下图给出了cd命令的几种形式,以及执行命令之后的当前目录。
在这里插入图片描述

现在给出初始时的当前目录和一系列目录操作指令,请给出操作完成后的当前目录。

输入说明
第一行包含一个字符串,表示当前目录。
后续若干行,每行包含一个字符串,表示需要进行的目录切换命令。
最后一行为pwd命令,表示输出当前目录
注意:

  1. 所有目录的名字只包含小写字母和数字,cd命令和pwd命令也都是小写。最长目录长度不超过200个字符。
  2. 当前目录已经是根目录时,cd … 和cd /不会产生任何作用

输出说明
输出一个字符串,表示经过一系列目录操作后的当前目录

输入样例
/d2/d3/d7
cd …
cd /
cd /d1/d6
cd d4/d5
pwd

输出样例
/d1/d6/d4/d5

#include<stdio.h>
#include<string.h>
int main(){
	int i,j,m=0,flag=1,count=0,n=0;
	char str[100][100]={'+'};
	char t[100],q[100],o[100];
	int r=0,c=0;
	i=0;
	
	j=0;
	int len=0;
	gets(q);
	len=strlen(q);
	q[len]='/';
	q[len+1]='-';
	j=1;
	while(1){
		if(q[0]=='/') break;
		if(q[j]=='-') break;
		while(1){
			if(q[j]=='/') break;
			str[r][c++]=q[j];
			q[j]='+';
			j++;
		}
		str[r][c++]='-';
		j++;
		r++;
		c=0;
	}
	j=0;
	while(1){
		gets(t);
		if(t[0]=='p'&&t[1]=='w'&&t[2]=='d') break;
		len=strlen(t);
		t[len]='/';
		t[len+1]='-';
		if(t[3]=='/'){	
						
				for(i=0;i<100;i++)
						for(j=0;j<100;j++)
							str[i][j]='+';
				r=0;
				if(t[5]=='-'){					
					
				}else{
					n=4;
					while(1){
					if(t[n]=='-') break;
						if(t[n++]=='/'){
							count++;
						}
					}
					n=4;
					for(r=0;r<count;i++){
						j=0;
						if(t[n]=='-');
						while(1){
							if(t[n]=='/'){
								str[r][j]='-';
								n++;
								break;
							}
							str[r][j++]=t[n++];
						}
						r++;
					}
					
				}
				
		}else{
			
			if(t[3]=='.'){
				if(r!=0){
					for(i=0;i<100;i++){
					str[r-1][i]='+';
					}
					r--;
				}				
				
			}else{
				j=3;
				while(1){
					if(t[j]=='-') break;
					while(1){
						if(t[j]=='/') break;
						str[r][c++]=t[j];
						j++;
					}
					str[r][c++]='-';
					j++;
					r++;
					c=0;
				}
				
			}
		}
	}
	if(r==0) printf("/");
	for(i=0;i<r;i++){
		j=0;
		printf("/");
		while(1){
			if(str[i][j]=='-') break;
			printf("%c",str[i][j++]);
		}
	}
	//str[100][100]='0';
	return 0;
} 

字符串相似度

标题
字符串相似度

类别
字符串处理

时间限制
1S

内存限制
256Kb

问题描述
最长公共子串指给定的两个字符串之间最长的相同子字符串(忽略大小写),最长公共子串长度可用来定义字符串相似度。
现给出两个字符串S1和S2,S1的长度为Len1,S2的长度为Len2,假设S1和S2的最长公共子串长度为LCS,则两个字符串的相似度定义为2LCS/(Len1+Len2)。
例如:S1=”App”,S2=”apple”,S1长度为3,S2长度为5,它们的最长公共子串为”App”,长度为3,则相似度为2
3/(3+5)=0.75。
现给出两个字符串,请计算它们的相似度结果保留3位小数。

输入说明
输入为两行,分别表示两个字符串S1和S2,每个字符串长度不超过100个字符,所有字符均为可打印字符,包括大小写字母,标点符号和空格。

输出说明
输出两个字符串的相似度,结果四舍五入保留3位小数。

输入样例
App
Apple

输出样例
0.750

#include<stdio.h>
#include<string.h>
void transf(char *p)
{ int i;
    for(i=0;*(p+i)!='\0';i++)
	{
	if( *(p+i) >= 'a' && *(p+i) <= 'z' )
		*(p+i) =*(p+i)-32 ;
	}
}
int main()
{  double result;
  char s1[100],s2[100],s3;
	int i,j,number=0,max=0;
 	gets(s1);
 	gets(s2);
 	  transf(s1);
 	  transf(s2);
 	int l1=strlen(s1),l2=strlen(s2);
 	int t1,t2;
 			for(i=0;i<l1;i++)
 				for(j=0;j<l2;j++)//主要思想还是将重复的地方找到
			 	{if(s2[j]==s1[i])
				 t1=i;t2=j;
				for(;s2[t2]==s1[t1]&&s2[t2]!='\0'&&s1[t1]!='\0';t1++,t2++)
				{	number++;
				}
				 if(number>=max)
					{ max=number;
					number=0;
					}
					else number=0;
			   }
		result=(2*(double)max)/((double)(l1)+(double)(l2));
		printf("%.3lf",result);
}

ISBN号码

标题
ISBN号码

类别
字符串处理

时间限制
1S

内存限制
256Kb

问题描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如"x-xxx-xxxxx-x",
其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。
ISBN码的首位数字表示书籍的出版语言,例如0代表英语;
第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;
第二个分隔之后的五位数字代表该书在出版社的编号;
最后一位为识别码。识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。
例如ISBN号码0-670-82162-4中的识别码4是这样得到的:
对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出正确的ISBN号码。

输入说明
输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

输出说明
输出一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。

输入样例
样例输入1
0-670-82162-4
样例输入2
0-670-82162-0

输出样例
样例输出1
Right
样例输出2
0-670-82162-4

#include<stdio.h>
#include<string.h>
void select(char a[],int *p);
int main(){
	char a[13];
   int b[10];
   int i,j,sum=0;
   gets(a);
   select(a,b);
   for(i=0;i<9;i++)
   {sum=sum+(i+1)*b[i];
   }
   if((sum%11)==b[9]) printf("Right");
		   else
		    {
		     if(sum%11==10)a[12]='X';
		     else   a[12]=sum%11+'0';
		     puts(a);
		    }
   return 0;
}
void select(char a[],int *p)
{int i,j;
	 for(i=0,j=0;a[i]!='\0';i++)
	 {if(a[i]>='0'&&a[i]<='9')
	 {*(p+j)=a[i]-'0'; 
	    j++; 
	 }
	 else if(a[i]=='X')
		 {*(p+j)=10;
		 j++;
		 }
	 else continue;
	 }
}

处理字符串

标题
处理字符串

时间限制
1S

内存限制
1000Kb

问题描述
从键盘输入一个字符串,将该字符串按下述要求处理后输出:
将ASCII码大于原首字符的各字符按原来相互间的顺序关系集中在原首字符的左边,
将ASCII码小于等于原首字符的各字符按升序集中在原首字符的右边。

输入说明
输入一行字符串,字符串c不长度超过100.

输出说明
输出处理后的一行字符串

输入样例
aQWERsdfg7654!@#$hjklTUIO3210X98aY

输出样例
sdfghjkla!#$0123456789@EIOQRTUWXYa

#include "stdio.h"
#include "string.h"
int main(){
	char c[100],a,m,b[100],d[100];
	int len;
	int i,j,k,l;
	scanf("%s",c);
	len=strlen(c);
	a=c[0];
	
	j=k=0;
	for(i=1;i<len;i++){
		if(c[i]<=a){
			b[j]=c[i];//右边 
			j++;
		}
		else{
			d[k]=c[i];
			k++;
		}
	}
	d[k]=a;
	d[k+1]=b[j]='\0';

	for(i=0;i<strlen(b)-1;i++)
	for(l=i;l<strlen(b);l++){
		if(b[i]>b[l]){
			m=b[i];
			b[i]=b[l];
			b[l]=m;
		}
	}

	strcat(d,b);
	printf("%s",d);
	return 0;
} 

欢迎打赏加三连

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十兮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值