每周一题(2)


致歉:前段时间博主在复习以及参加期末考试,加之最近状况不大好,所以停更了一段时间。现在已经放了寒假,后续会坚持更新每周一题,预计是每周四的晚上。
关于内容:博主近期在准备3月份的CSP认证考试,以及蓝桥杯竞赛,所以都会从这些题库里来找题。CSP只做前两道题,原因其一是本人水平有限,其二是前两道题更好把握。因为每次的CSP均分会在130分左右,前两道题拿满能得到200分,足够排到参加考试的考生前18%左右的水平。我的内容只针对前两道题,会对每个细节做出解释,能够通过所有测试用例,确保不丢分。如有更高追求者请绕道。

报数

问题描述

g-blog.csdnimg.cn/20200116184006382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xoeDA1MjU=,size_16,color_FFFFFF,t_70)在这里插入图片描述

题目来源

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;
}
发布了11 篇原创文章 · 获赞 13 · 访问量 2862

猜你喜欢

转载自blog.csdn.net/lhx0525/article/details/104009498
今日推荐