Bootstrap

蓝桥杯2024年11月20日个人赛报名页下方例题解答

原题:

小明对数位中含有2、0、1、9 的数字很感兴趣(不包括前导0),在1到40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574。

请问,在1到n中,所有这样的数的和是多少?


这个题本身并没有太难,比较复杂的地方在于判断,官网给出了一种更加简洁的方法,但是我当时没有看,我看到题目后立刻尝试着手自我解答,下面给出一种我的思路:

首先设立一个input用于接收我们输入的n,然后搞一个变量用于控制从1到n的循环,用以判断循环中这些数字是否属于我们的筛选范畴,如果属于则用sum+=它,如果不属于则跳过,反复判断之后,我们可以得到正确答案,下面给出完整的代码解答过程:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	int input = 0; int m = 0;
	int sum = 0; int n = 0;
	int t = 0;
	scanf("%d", &input);
	for (n = input; n > 0; n--) {
		while (n / 10 != 0) {
			m++;
			n /= 10;
		}
		m += 1; n = input-t;//至此位数依然清楚为m
		for (m = m; m >= 0; m--) {
			if (n % 10 == 9 || n % 10 == 2) {
				printf("%d\n", input - t);
				sum += input-t;
				break;
			}
			else if (n % 10 == 1) {
				printf("%d\n", input - t);
				sum += input-t;
				break;
			}
			else if (n > 9 && n % 10 == 0) {
				printf("%d\n", input - t);
				sum += input-t;
				break;
			}
			if (n / 10 != 0) {
				n = n / 10;
			}
		}
		t++; m = 0; n++;
	}
	printf("Sum=%d", sum);
	return 0;
}

我想到一个事情就是,如果我们多设立几个变量,比如a1、a2、a3、a4,并且用scanf分别给它们赋值,再用它们替换循环判断中2、9、1、0的位置,这样我们就可以求出任意1~n以内,包含a1、a2、a3、a4的数字的和,算是拓展了一下这个题。

关于这个代码,我设置了可以把每一个被加进sum的数字进行打印的功能,以方便我们判断是否有搞错或者漏掉的项(虽然实际操作起来判断仍然不是特别直观)。

;