C语言之蓝桥杯习题(2)

目录

一.第一题

1.问题:小蓝制作门牌号

2.解题过程

(1)方法1(数字转化法)

(2)方法2(转化数字个位比较法)

3.结果:

4.总结:

二.第二题

1.问题:顺子日期

2.解题过程:

3.结果

4.总结:

三.第三题

1.问题:小蓝排箱子

2.解题过程

3.总结


一.第一题

1.问题:小蓝制作门牌号

这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

2.解题过程

(1)方法1(数字转化法)

int main()
{
	int a = 0, b = 0,c=0;
	int arr[2020] = { 0 };
	char arr2[10] = { '0' };

	for (a = 0; a < 2020; a++)
	{
		arr[a]=a+ 1;//数组内每个元素都放上数字
		sprintf(arr2,"%d",arr[a] );//关键使用sprintf来进行数字转化字符串
		for (b = 0; b < 4; b++)
		{
			if (arr2[b] == '2')判断有几个2,计算字符2的个数
				c++;
		}
	}
printf("%d",c);
	
	return 0;
}

(2)方法2(转化数字个位比较法)

int c = 0;
void part(int a)
{
	if (a % 10 == 2)//判断其个位是否位2
		c++;
	else
		;
	if (a > 10)//比个位大的将进行/10操作将十位转化位个位
	{
		a = a / 10;
		part(a);//进行递归操作计算个位以上的数字是否为2
	}
	else
		;
}
int main()
{
	int a = 0, b = 0;
	int arr[2020] = { 0 };
	for (a = 0; a < 2020; a++)
	{
		arr[a] = a + 1;
		part(arr[a]);
	}printf("%d",c);
	return 0;
}

3.结果:

C语言之蓝桥杯习题(2)_第1张图片

4.总结:

(1).使用sprinf可以进行数字转化成字符串,sprintf - C++ Reference (cplusplus.com)使用方法。

当然它还可以进行字符串转化数字,字符串连接等。

(2).对于判断数字的每一位是否符合等于某一个数可以用%10来判断个位,然后让较大的位进行除以10操作然后再%,这个操作可以用递归来做。

二.第二题

1.问题:顺子日期

小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。
顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。
例如20220123 就是一个顺子日期,因为它出现了一个顺子:123;
本题顺子的定义:i j k 是一个顺子,满足 i+1=j、j+1=k、i≥0。
而20221023 则不是一个顺子日期,它一个顺子也没有。
小明想知道在整个2022年份中,一共有多少个顺子日期。
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。

2.解题过程:

int main()
{
	int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//明确每个月最多有几天,进行
	int a, b,c,d,e=0;
	for(a=0;a<2;a++)//月的十位
	{
		for (b = 0; b <= 9; b++)//月的个位
		{
			if ((a * 10 + b) <= 12)//保证月是合法的
			{
				for (c = 0; c <= 3; c++)//日的十位
				{
					for (d = 0; d <= 9; d++)//日的个位
					{
						if (arr[a * 10 + b] >= (c * 10 + d))//保证日是合法的
						{
							if (((a + 1) == b) && ((a + 2) == c))//判断前三个数是否合法
								e++;
							else
								if (((b + 1) == c)&&((b + 2) == d))//判断后三个数是否合法
								{
									e++;
								}
						}
					}
				}
			}
		}
	}printf("%d",e);
	return 0;
}

3.结果

C语言之蓝桥杯习题(2)_第2张图片

 

4.总结:

注意:月份的合法性,

三.第三题

1.问题:小蓝排箱子

小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝
规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、
宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上
分别堆 L 、 W 、 H 的货物,满足 n = L × W × H 。
给定 n ,请问有多少种堆放货物的方案满足要求。
例如,当 n = 4 时,有以下 6 种方案: 1 × 1 × 4 、 1 × 2 × 2 、 1 × 4 × 1 、 2 × 1 × 2 、
2 × 2 × 1 、 4 × 1 × 1 。
请问,当 n = 2021041820210418 (注意有 16 位数字)时,总共有多少种

2.解题过程

//方法一:三循环
int main()
{
	long long n = 0,l,w,h;
	int a = 0;
	scanf("%lld", &n);
	for (l = 1; l <= n; l++)
	{
		for (w = 1; w <= n; w++)
		{
			for (h = 1; h <= n; h++)
			{
				if (n == (l * h * w))
					a++;
			}
		}
	}printf("%d",a);
	return 0;
}
//方法二:找因数,再选择判断
int main()
{
	int arr[10000];
	long long n,b;
	int a = 0,c=0,l, w, h;
	scanf("%lld",&n);
	for (b = 1; b <= n; b++)
	{
		if (n % b == 0)
		{
			arr[c] = b;
			c += 1;
		}
	}
	for (l = 0; l <= c; l++)
	{
		for (w = 0; w <= c; w++)
		{
			for (h = 0; h <= c; h++)
			{
				if (n == (arr[l] * arr[h] * arr[w]))
					a++;
			}
		}
	}printf("%d", a);
	return 0;
}

3.总结

注意变量可以取值范围

你可能感兴趣的:(小白C语言之蓝桥杯习题,蓝桥杯,c语言,算法)