简单素数问题1
题解:
对待求数开方,然后进行枚举判断就行,降低算法复杂度到sqrt(n),第二题讲介绍一种非暴力求解的方法,
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
bool judge(int n)
{
if(n<=1) return false;
int t = (int)sqrt(n) + 1;
for(int i = 2; i < t;i++){//注意当n为2时,2本身并不能作为判断不是素数的条件
if(n % i == 0) return false;
}
return true;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
cout<<(judge(n) ? "yes" : "no");
}
}
素数筛选问题2
讨论:假如还用上题的枚举方法判断,不切实际,可以考虑一个想法,把已知素数的倍数都标位非素数,这是显而易见的,然后只需要判断一个新来的数,是不是已知素数的倍数即可,不是的话即标记为素数,并且把它的倍数标记为非素数。
题解:
预处理,初始化数组,标记全部都是素数默认,有注意到的是标记非素数时从i,本应该是i2开始,为了节省资源,从ii开始,因为显而易见的是ik,k<i,所以ik必将已经由 i 为k时就已经标记好了,没必要重复标记。
具体步骤见代码注释
#include<iostream>
using namespace std;
int prime[10000];//筛选的素数
int primeSize;//素数个数
bool mark[10001];//标记非素数
void init(){
for(int i = 1; i <= 10000; i++){
mark[i] = false;//标记为素数
}//初始化全部为素数
primeSize = 0;
for(int i = 2; i <= 10000; i++){//输入从2开始
if(mark[i] == true) continue;//跳过非素数
prime[primeSize++] = i;//从2开始为素数
for(int j = i * i; j <= 10000;j+=i){//标记倍数
mark[j] = true;//非素数
}
}
}
int main(){
//初始化素数
init();
int n;
while(scanf("%d",&n)!=EOF){
bool output = false;
for(int i = 0; i < primeSize; i++){
if(prime[i]%10==1&&prime[i] < n){
if(output == false)
output = true;
cout<<prime[i];
cout<<" ";
}
}
if(output == false)
cout<<-1<<endl;
else
cout<<endl;
}
}
分解素数因子3:
解析/难点:
难点:
附上:
#include<iostream>
using namespace std;
bool mark[10001];
int prime[10001];
int primeSize;
void init(){
primeSize = 0;
for(int i = 2; i <= 10000;i++){
if(mark[i] == true) continue;
prime[primeSize++] = i;
for(int j = i*i;j <= 10000;j += i)
{
mark[j] = true;
}
}
}
int main(){
init();
int n;
while(scanf("%d",&n)!=EOF){
int ansPrime[30];
int ansSize = 0;
int ansNum[30];//幂指数的记录
int ans ;
for(int i = 0; i < primeSize;i++){
if(n % prime[i] == 0){//潜在可能成为目标因数(幂非0)
ansNum[ansSize] = 0;
ansPrime[ansSize] = prime[i];
while(n % prime[i] == 0){
ansNum[ansSize]++;//幂增加
n /= prime[i];
}
//while n == 1时结束
ansSize++;
if(n==1) break;
}
}
if(n != 1){//对应上面的难点---6.
ansPrime[ansSize] = n;
ansNum[ansSize++] = 1;
}
ans = 0;
for(int i = 0; i < ansSize;i++){
ans += ansNum[i];
}
cout<<ans<<endl;
}
}