蓝桥杯训练题C语言

开学后就很少抽空写写题了,所以这次只有几道题目和大家分享一下了。

有些真题也有些VIP基础题,想和大家分享一下。(有些是仿的其他博主的代码,,,,因为有些确实难(呜呜呜~))

不多说,上代码

1.时间转换

给定一个以秒为单位的时间t,要求用“<H>:<M>:<S>”的格式来表示这个时间。

<H>表示时间,<M>表示分钟,而<S>表示秒,它们都是整数且没有前导的“0”。

例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。

一种解法:计算步骤为 时(t/3600)->分(t%3600/60)->秒(t%3600%60)

#include<stdio.h>
int main()
{
	int t,h,m,s;
	scanf("%d",&t);
	h=t/3600;
	m=(t%3600)/60;
	s=((t%3600)%60);
    printf("%d:%d:%d",h,m,s);
	return 0;
}

钟另一种解法:计算步骤 秒(满60秒钟清零,分钟加1)->分(满60分钟清零,时加1)->时

#include<stdio.h>
int main()
{
	int h=0,m=0,s=0,i,n;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		s++;
		if(s==60)
		{
			m++;
			s=0;
		}
		if(m==60)
		{
			h++;
			m=0;
		}
	}
	printf("%d:%d:%d",h,m,s);
	return 0;
}

2.字符串对比

给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:

  1:两个字符串长度不等。比如 Beijing 和 Hebei

  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing

  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing

  4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing

  编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。

易错:一定要区分3和4,不注意会将4误判成3,所以写代码一定要严谨,加上排除3的前提条件。

#include<stdio.h>
#include<string.h>
int main()
{
	char a[2][100];
	int i,n,k=0,m;
	scanf("%s%s",a[0],a[1]);
	for(i=0;a[0][i]!=0;i++)
	{
		if(strlen(a[0])==strlen(a[1])&&a[0][i]-a[1][i]!=32&&a[1][i]-a[0][i]!=32&&a[1][i]!=a[0][i])
		{
			printf("4");
			return 0;
		}	
	}
	if(strlen(a[0])!=strlen(a[1])){printf("1");return 0;}
	else if(strcmp(a[0],a[1])==0){printf("2");return 0;}
	else {printf("3");return 0;}
}

3.矩阵乘法

给定一个N阶矩阵A,输出A的M次幂(M是非负整数)

  例如:

  A =

  1 2

  3 4

  A的2次幂

  7 10

  15 22

强调:矩阵运算中   1.矩阵的0次幂为单位矩阵(对角线全为1,其余全为0)

                                2.矩阵的1次幂为原矩阵(矩阵本身)

                                3.矩阵a的m次幂=(a的m-1次幂)*矩阵a

                                步骤:a的第1行的第一个元素乘以b中第1列的第一个元素,a的第1行的第二个元素乘以b中第1列的第二个元素,结果相加存入c的第1行第1列,a的第1行的第1个元素乘以b中第二列的第1个元素,a的第二行的第二个元素乘以b中第二列的第二个元素,结果相加存入c的第1行第2列.。。。。a[i][k]*b[k][j]结果存入c[i][j]。

a的第i行和b的每一列相乘。

#include<stdio.h>
int main()
{
	int N,M,i,j,k,p,n=0;
	long long c[50][50],a[50][50],b[50][50];
	scanf("%d %d",&N,&M);
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		{
			scanf("%d",&a[i][j]);
			b[i][j]=a[i][j];
		}
	}
	if(M<=1)
	{
		for(i=0;i<N;i++)
		{
			for(j=0;j<N;j++)
			{
				if(M==0)
				{
					if(i==j)a[i][j]=1;
					else a[i][j]=0;
					printf("%d ",a[i][j]);
				}
				else printf("%d ",a[i][j]);
			}
			printf("\n");
		}
	}
	else 
	{
		for(p=0;p<M-1;p++)
		{
			for(i=0;i<N;i++)
			{
				for(j=0;j<N;j++)
				{
					for(k=0;k<N;k++)
					{
						n+=a[i][k]*b[k][j];
					}
					c[i][j]=n;
					n=0;
				}
				
			}
			for(i=0;i<N;i++)
			{
				for(j=0;j<N;j++)
				{	
					if(p==M-2)printf("%lld ",c[i][j]);
					else b[i][j]=c[i][j];
				}
				if(p==M-2)printf("\n");

			}
		}
	}
	
	return 0;
}

4.矩形交面积

平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。

对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。

注意:题中只说明给出相对顶点的坐标,但是并没有明确说是哪两个(左下右上还是左上右下),所以要分多种考虑。给出下面分析:

#include<stdio.h>
double min(double a,double b)
{
	if(a<b)return a;
	else return b;
}
double max(double a,double b)
{
	if(a>b)return a;
	else return b;
}
int main()
{
	double x1,y1,x2,y2,x3,y3,x4,y4,area,a1,a2,b1,b2;
	scanf("%lf%lf %lf%lf %lf%lf %lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
	a1=max(min(x1,x2),min(x3,x4));
	a2=min(max(x1,x2),max(x3,x4));
	b1=max(min(y1,y2),min(y3,y4));
	b2=min(max(y1,y2),max(y3,y4));
	if(a2>a1 && b2>b1)printf("%.2lf",(a2-a1)*(b2-b1));
	else printf("0.00");
	return 0;
}

5.时间显示

输入一个毫秒值例如

46800999

要求输出

13:00:00

缺位补0

注意:设置时钟时一定要设置当时钟到达24时清零的动作,因为题目中给出的毫秒不一定是在一整天毫秒时间内(24小时->毫秒),可能存在不止一天的情况,但是题目只要求输出一天内的时、分、秒,所以要对时钟进行设置。

#include<stdio.h>
int main()
{
	int h=0,m=0,s=0,n,i;
	scanf("%d",&n);
	n/=1000;//转为秒
	for(i=0;i<n;i++)
	{
		s++;
		if(s==60)//进位分钟
		{
			s=0;
			m++;
		} 
		if(m==60)//进位时钟
		{
			m=0;
			h++;
		}
		if(h==60)//时钟设置
		{
			h=0;
		}
	}
	printf("%.2d:%.2d:%.2d",h,m,s);//输出各为两位的时间数字
	return 0;
}

6.门牌制作

小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。

小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,

例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。

请问要制作所有的1到2020号门牌,总共需要多少个字符2?

分析:对数进行分解,从个位、十位、百位....进行提取去判断是否为2,是则被记录,否则不做处理。

#include<stdio.h>
int main()
{
	int i,j,k=0;
	for(i=1;i<2021;i++)
	{
		j=i;
		while(j)
		{
			if(j%10==2)k++;
			j/=10;
		}
	}
	printf("%d",k);
} 

在参考其他博主代码的基础上增加了些自己的见解,希望对大家的学习有用。 

猜你喜欢

转载自blog.csdn.net/weixin_61936651/article/details/124042144