201912-1报数

题目

题目链接:报数

这里给出题目的截图

image-20211202172111340

思路

这个题目很简单,我为什么会写上来呢?因为我真的很菜,做错了好多次(无声哭泣)。

那就来认真分析一下吧。

题目要求我们进行报数是吧,有7的或者是7的倍数的就要求跳过,最后统计出每个人跳过了多少次是吧。

既然只有四个人,那么我们用一个4个长度数组表示他们吧,开一个arr[4],然后数组具体的值就是他们跳过的次数,为什么可以这样子呢?这个报数的过程其实是一个四个长度的循环,超过4之后又会回来了。也就是说,如果这个数是4的倍数的话,那就刚好会报道第四个人就会结束,那如果不是,那余数就表示当前数是第几个人报的。比如说余数是3,那也就是说,要从头开始报三个人,那刚好就是第三个人报完嘛!

如果报当前数字的人要跳过,我去余数就知道他是第几个人了嘛(余数为0时表示是第4个人),这样子就可以进行统计啦!也就是执行

1
arr[k%4]++;

假设当前报数为7,那么我们取余,得到3,说明7是第三个人应该报的数,但是他要跳过,所以就是在他的跳过次数上加1.

image-20211202173045843

当然,题目还有另外一个考点啦,那就是怎么判断它是7的倍数或者出现了7呢?(我就错在了这里

7的倍数很简单了,对7取余就行了。

然后就是数字含有7怎么解决,我们采取将它的每一位取出来判断,怎么做呢?那就是不断地除以10,比如说100除以10等于10,再除以10就等于1,就相当于把百位数字取出来了。

好,那讲解就到这里,看代码吧。

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**< 报数 */

#include <iostream>

using namespace std;

bool have_seven(int x) {
	if (x % 7 == 0)return true;
	else {
		while (x) {
			if (x % 10 == 7)return true;
			x /= 10;
		}
		return false;
	}
}
int n;
int arr[4];
int main() {
	cin >> n;
	int m = 1, k = 1;
	while (m <= n) {
		if (have_seven(k)) {
			arr[k % 4]++;
		} else m++;
		k++;
	}

	for (int i = 1; i <= 3; i++) {
		cout << arr[i] << endl;
	}
	cout << arr[0];
	return 0;
}

结语

哎,没想到自己连这种基础的题目也要写那么久,真的有一点心累了,看来这次认证是不能够达到自己的目标了。努力去考吧,实在不如愿的话来年再考一次。加油吧!

0%