致歉:前段时间博主在复习以及参加期末考试,加之最近状况不大好,所以停更了一段时间。现在已经放了寒假,后续会坚持更新每周一题,预计是每周四的晚上。
关于内容:博主近期在准备3月份的CSP认证考试,以及蓝桥杯竞赛,所以都会从这些题库里来找题。CSP只做前两道题,原因其一是本人水平有限,其二是前两道题更好把握。因为每次的CSP均分会在130分左右,前两道题拿满能得到200分,足够排到参加考试的考生前18%左右的水平。我的内容只针对前两道题,会对每个细节做出解释,能够通过所有测试用例,确保不丢分。如有更高追求者请绕道。
报数
问题描述
题目来源
CSP 201912-1
题解
跳过函数
由题意可知,必须想出一个方法,来跳过不满足条件的数。有两种数是会被跳过的,也就是两个条件:
1.能被7整除的数。
2.各位数字含有数字7的。
根据上述条件,设计出以下判断函数作为参考。
int isSkip(int num)
{
int flag = 0;
if(num % 7 == 0) //判断整除7
flag = 1;
while(num != 0){ //判断包含7
int k = num % 10;
if(k == 7)
flag = 1;
num = num / 10;
}
if(flag) return 1;
else return 0;
}
第二个条件在编写时,是按照从最低位到最高位,一位一位来进行判断的。因为如果直接对10取余数,取到的一定是个位数,随后在用num除以10,达成把最低位舍弃掉的目的。
主函数思路
因为题目是固定的甲乙丙丁这四个人,所以我们干脆使用一个长度为4的数组,分别代表这四个人。数组每个元素的值就代表每个人跳过的数的个数。
由题意可知,我们想要报的数量,跟最后一个人报出的数字是不一样的,因为在这中间有被跳过的数。所以还使用了一个计数变量,每该报一个数时,这个计数变量cnt都要加一,除非这个数需要被跳过,这时候在把cnt减一,即可达到没有计数的效果。
因为每循环一次都要访问数组中的下一个元素,而数组中仅有4个元素,下标不可能增加到报数的个数那么多,所以我们采用的取模方法。即a[p%4]++。
全部代码示例如下。
#include<bits/stdc++.h>
using namespace std;
int isSkip(int num)
{
int flag = 0;
if(num % 7 == 0) //判断整除7
flag = 1;
while(num != 0){ //判断包含7
int k = num % 10;
if(k == 7)
flag = 1;
num = num / 10;
}
if(flag) return 1;
else return 0;
}
int main()
{
int n;
scanf("%d",&n);
int a[4]={0};//代表甲、乙、丙、丁
int p=0;//下标
int cnt = 0;//计数变量
for(int i=1;;i++){
cnt++;
if(isSkip(i)){
a[p%4]++;
cnt--;//如果不满足条件,不计数
}
p++;
if(cnt==n)
break;
}
printf("%d\n%d\n%d\n%d\n",a[0],a[1],a[2],a[3]);
return 0;
}