一、leetcode:计数质数
题目:统计所有小于非负整数 n 的质数的数量。
示例:
题解:首先说下质数的定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。其次,说下本文使用的方法:厄拉多塞筛法。
西元前250年,希腊数学家厄拉多塞(Eeatosthese)想到了一个非常美妙的质数筛法,减少了逐一检查每个数的的步骤,可以比较简单的从一大堆数字之中,筛选出质数来,这方法被称作厄拉多塞筛法(Sieve of Eeatosthese)。
具体操作:先将 2~n 的各个数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于 n 的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 n 的素数。
C++代码实现:
class Solution {
public:
int countPrimes(int n) {
if(n<3){return 0;}//0和1既不是质数也不是合数
else if(n==3){
return 1;//只有2
}
else{
vector<int>v(n-1,true);
for(int i=2;i<=sqrt(n);i++){
int k=i;
if(v[i-1]==true){
while((i*k)<n){
v[i*k-1]=false;
k++;
}
}
}
int count=1;
for(int i=2;i<v.size();i++){
if(v[i]==true)count++;
}
return count;
}
}
};
二、牛客题:质数因子
题目:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )最后一个数后面也要有空格
输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
代码实现:
实现原理:while(num%质数因子==0)
num=num/质数因子.
#include<iostream>
using namespace std;
int main(){
long n;
cin>>n;
long k=2;//依次除以2、3、4...,但只有k都为质数因子时才能满足下列while循环条件n%k==0,
//比如n=180,180/2/2=45,那45肯定不能再除以4了,所以push进v中的k都是质数。
while(n!=1){
while(n%k==0){
n=n/k;
cout<<k<<" ";
}
k++;
}
return 0;
}