第十一届蓝桥杯 合数个数

试题 A: 合数个数

本题总分:5 分

【问题描述】

一个数如果除了 1 和自己还有其他约数,则称为一个合数。例如:1, 2, 3
不是合数,4, 6 是合数。
请问从 1 到 2020 一共有多少个合数。

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解析

在1-2020这些数中,构成有3部分:质数、合数、既非质数亦非合数。
既非质数亦非合数只有数字"1"。
那么合数个数 = 总数2020 - 质数个数 - 1,因此题目可以转换为求解质数的个数;
质数的求解可以参考我的另一篇文章“质数的判断”

程序

#include <bits/stdc++.h>
using namespace std;

//判断一个数是否为质数
bool isPrime(int x){
    if(x <= 1) return 0;
    if(x <= 2) return 1;
    if(x <= 4) return 0;
    for(int i=5; i < (int)sqrt(x); i+=6){
        if((x%i == 0) || (x%(i+2) == 0)) return false;
    }
    return true;
}

int main()
{
    int countsPrime = 2;//质数的数量,从5开始判断,故而小于5有两个质数
    int countsCom = 0;//合数的数量
    int total = 2020; //总的数量

    //只判断是否在6x两边即可
    for(int i=5; i<=total; i+=6){
        if(isPrime(i)) countsPrime++;
        if((i+2) <= total)
            if(isPrime(i+2)) countsPrime++;
    }
    //total是总数,这里减1是因为1既不是质数也不是合数
    countsCom = total - 1 - countsPrime;
    cout << "countsPrime = " << countsPrime << endl;
    cout << "countsCom = " << countsCom << endl;
    return 0;
}

结果

yocin@ubuntu:~/Documents/cppPractice$ ./main
countsPrime = 317
countsCom = 1702 # 最终结果
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值