CCF CSP 2019-12-1 “报数” 解题思路及满分代码(C++11)

2023-05-16

文章目录

    • 题目描述
    • 解题思路
    • 满分代码

题目描述

在这里插入图片描述
在这里插入图片描述

解题思路

题目比较简单,需要搞清楚两个点:

  1. 跳过的数是7的倍数或含7的数,即取余为0或各个位上有7的数
  2. n代表的是总共的报数个数,跳过的数是不算的

下面就只要解决如何判定一个数是否需要跳过的问题了:

对于每个数num:

(1)判断是否是7的倍数:num%7 == 0

(2)判断是否含7:由于n最大可以到666,所以最终num的数字会比较大,所以我们需要用一个循环对每一位上都进行判断。从个位开始,判断是否为7,即 num%10 == 7,若是,对当前num结束判断;若不是,则num = num/10,继续对高一位进行判断,直到最后 num/10 == 0,判断结束。

最后输出的是四个人分别跳过的个数,判断num跳过时相应的计数器做自增即可。

最后贴上满分代码

满分代码

#include<cstdio>
#include<iostream>
using namespace std;

int main() {
	int n;
	int count[4] = {0}; //甲乙丙丁四人跳过的个数 
	cin >> n;
	int k=0, num=1; //k为总共报了多少个数,num是当前数字 
	while(k<n) {
		int temp = num; //临时变量,用于判断每一位是否为7 
		int flag = 0; //标记是否跳过当前数 
		if(temp%7==0) flag = 1; //是否为7的倍数 
		else{
			//从个位开始判断是否为7,不是则除10,继续判断下一位 
			while(temp%10!=7 && temp/10!=0) {
				temp = temp/10;
			}
			if(temp%10==7) flag = 1;
		}
		//若跳过当前数,相应人的计数器要加1 
		if(flag == 1) {
			if(num%4==0) count[3]++;
			else count[num%4-1]++;
		}else  k++; //不跳过则总报数个数+1 
		num++;
	}
	for(int i=0; i<4; i++) {
		cout << count[i] << endl;
	}
	return 0;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CCF CSP 2019-12-1 “报数” 解题思路及满分代码(C++11) 的相关文章

随机推荐