csp试题1:报数
-
- 题目
- 分析
- 代码
- 总结
题目
题目描述
甲乙丙丁决定玩一个报数的游戏来打发时间。游戏规则为四个人从1开始轮流进行报数,但如果需要报出的数是7的倍数或含有数字7则直接跳过。
此外大家约定,在总共报出了n个数字后(不计入被跳过的数)游戏结束。现在需要你来帮忙统计,游戏过程中每个人各自跳过了几次。
输入格式
从标准输入读入数据。
输入仅一行,包含一个正整数n,表示报出了多少个数后游戏结束。
输出格式
输出到标准输出。
输出共四行,每行一个整数,一次表示甲乙丙丁四人在游戏过程中跳过的次数。
样例1
输入:
20
输出:
2
1
1
0
解释:
报数过程如下
甲:1,乙:2,丙:3,丁:4
甲:5,乙:6,丙:跳过,丁:8
甲:9,乙:10,丙:11,丁:12
甲:13,乙:跳过,丙:15,丁:16
甲:跳过,乙:18,丙:19,丁:20
甲:跳过,乙:22,丙:23,丁:24
样例2
输入:
66
输出:
7
5
11
2
子任务
测试点1、2、3、4和5,保证n<=102
测试点6、7、8、9、10,保证n<=666。
分析
- 接收数据n
- 初始化一个计数数组,用于保存甲乙丙丁跳过的次数
- 模拟进行报数操作: 不断进行连续报数,如果报出的数是7的倍数,则需要跳过,即times[j]++,同时跳过了一个数,n应该加一个1 ;如果数字中含有7,则跳过,即times[j]++,同时跳过一个数,n应该加一个1 。
- 输出结果
代码
#include <iostream>
using namespace std;
int main(){
//1. 接收数据
int n;
cin >>n;
//2. 初始化一个计数数组,用于保存甲乙丙丁跳过的次数
int times[4] = {0, 0, 0, 00};
//3. 模拟进行报数操作
for(int i=1; i<=n; i++){
int j = (i-1)%4; //j用来确定是甲乙丙丁中的哪个人
//3.1 如果 报出的数是7的倍数,则跳过,即times[j]++,同时跳过一个数,n应该再加1
if(i%7 == 0){
times[j]++;
n++;
continue; //已经跳过,不去判断数字中是否含有7
}
//3.2 如果 数字中含有7,则跳过,即times[j]++,同时跳过一个数,n应该再加1
int temp = i;
while(temp/10 > 0 || temp%10 > 0){ //遍历数字中的每一个数
if(temp%10 == 7){
times[j]++;
n++;
break;
}
temp = temp/10;
}
}
//4. 输出结果
for(int i=0; i<4; i++){
cout <<times[i]<<endl;
}
return 0;
}
总结
核心在于判断数字中是否含有数字7。