1、计数质数
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
思路:
- 强调一下,1既不是质数,也不是合数。
- 对于2,3这样的质数,我们将其倍数标记为不是质数。剩下的就都是质数了。
- 埃拉托斯特尼筛法,自己百度。
代码:
class Solution {
public:
int countPrimes(int n) {
int count=0; //1不是质数,也不是合数
vector<bool> Prime(n,true); //题目要求小于n,此时创建n个即可
for(int i=2;i<n;i++)
{
if(Prime[i])
{
count++;
for(int j=2;i*j<=n;j++)
{
Prime[i*j]=false;
}
}
}
return count;
}
};
结果:
2、质数因子
华为笔试题,题目描述:
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
最后一个数后面也要有空格
输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
示例1
输入
180
输出
2 2 3 3 5
思路:
- 先求出所有因子。
- 对所有因子排序,找出最大因子。
- 对最大因子求一个质数表。
- 对所有因子进行查表,如果是质数,则输出。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long n;
cin>>n;
vector<long> nums;
if(n==1)
{
return 0;
}
//求因子
while(1)
{
for(int i=2;i<=n;i++)
{
if(n%i==0)
{
nums.push_back(i);
n/=i;
break;
}
}
if(n==1)
break;
}
//排序
sort(nums.begin(), nums.end());
//求质数表,利用题目1、计数质数的方法
int m=nums.back();
vector<int> dp(m+1,true);
for(int i=2;i<=m;i++)
{
if(dp[i])
{
for(int j=2;i*j<=m;j++)
{
dp[i*j]=false;
}
}
}
//查表
for(auto & e:nums)
{
if(dp[e])
cout<<e<<" ";
}
return 0;
}
结果: