您的位置:首页 > 其它

ccf-csp #201912-1 报数

2020-04-07 18:29 1136 查看

题目思路

题意在题目描述中已经表达得很清楚了,如果注意读题,不遗漏信息,这应该是一道妥妥的水题。

设变量 cntcntcnt 表示报出了多少个数字(不计入被跳过的数),变量 numnumnum 表示包含跳过的数,当前报到多少,数组 aaa 记录四个人被跳过的次数,函数 checkcheckcheck 检查 numnumnum 是否为包含7或者为7的倍数的数。

我们只要去模拟这个报数的过程,不断递增 numnumnum 的值,同时用 checkcheckcheck 函数检查是否需要跳过,如果不需要跳过就增加 cntcntcnt 的值,否则增加被跳过的次数。直到 cntcntcnt 的值等于 nnn 。

我们发现,(num−1)%4==0(num-1)\%4==0(num−1)%4==0的数是轮到甲报的,(num−1)%4==1(num-1)\%4==1(num−1)%4==1的数是轮到乙报的……,于是我们就可以在他们被跳过时,用 a[(num−1)%4)]++a[(num-1)\%4)]++a[(num−1)%4)]++ 进行计数。

代码如下

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1e3 + 10;
int n, a[10];

/**
* 检查n是否为包含7或者为7的倍数的数
* 如果是就返回0,否则返回1
*/
int check(int n) {
if (n % 7 == 0) return 0;
while (n) {
if (n % 10 == 7) return 0;
n /= 10;
}
return 1;
}

int main()
{
scanf("%d", &n);
int cnt = 0, num = 0;
while (1) {
num++;
if (check(num)) {
cnt++;
} else {
a[(num - 1) % 4]++;
}
if (cnt == n) break;
}
for (int i = 0; i < 4; i++)
printf("%d\n", a[i]);
return 0;
}
  • 点赞 2
  • 收藏
  • 分享
  • 文章举报
VeggieOrz 发布了89 篇原创文章 · 获赞 652 · 访问量 70万+ 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: