201912-1报数
题目
题目链接:报数
这里给出题目的截图
思路
这个题目很简单,我为什么会写上来呢?因为我真的很菜,做错了好多次(无声哭泣)。
那就来认真分析一下吧。
题目要求我们进行报数是吧,有7的或者是7的倍数的就要求跳过,最后统计出每个人跳过了多少次是吧。
既然只有四个人,那么我们用一个4个长度数组表示他们吧,开一个arr[4]
,然后数组具体的值就是他们跳过的次数,为什么可以这样子呢?这个报数的过程其实是一个四个长度的循环,超过4之后又会回来了。也就是说,如果这个数是4的倍数的话,那就刚好会报道第四个人就会结束,那如果不是,那余数就表示当前数是第几个人报的。比如说余数是3,那也就是说,要从头开始报三个人,那刚好就是第三个人报完嘛!
如果报当前数字的人要跳过,我去余数就知道他是第几个人了嘛(余数为0时表示是第4个人),这样子就可以进行统计啦!也就是执行
arr[k%4]++;
假设当前报数为7,那么我们取余,得到3,说明7是第三个人应该报的数,但是他要跳过,所以就是在他的跳过次数上加1.
当然,题目还有另外一个考点啦,那就是怎么判断它是7的倍数或者出现了7呢?(我就错在了这里)
7的倍数很简单了,对7取余就行了。
然后就是数字含有7怎么解决,我们采取将它的每一位取出来判断,怎么做呢?那就是不断地除以10,比如说100除以10等于10,再除以10就等于1,就相当于把百位数字取出来了。
好,那讲解就到这里,看代码吧。
代码
/**< 报数 */
#include
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;
}
结语
哎,没想到自己连这种基础的题目也要写那么久,真的有一点心累了,看来这次认证是不能够达到自己的目标了。努力去考吧,实在不如愿的话来年再考一次。加油吧!