试题 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 # 最终结果