0
点赞
收藏
分享

微信扫一扫

HDU Largest prime factor(埃拉托色尼筛选法求素数模板法改动)

whiteMu 2022-08-03 阅读 73


题目地址:​​点击打开链接​​

题意:给你一个数,求它这个数的最大素因子在素数表的第几位

思路:刚开始思路有一点错误,看错误代码

错误代码:

#include <iostream>0
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

typedef long long ll;
using namespace std;
const int maxn = 1e6+10;

int isprime[maxn];

void init()
{
int i,j;
int nprime = 0;
memset(isprime,-1,sizeof(isprime));
isprime[1] = 0;
for(i=2; i<maxn; i++)//刚开始程序老是崩溃,后来开小就不会崩溃,但实际上我觉得应该开到maxn,AC的程序也开到了maxn
{
if(isprime[i] == -1)
{
nprime++;
isprime[i] = nprime;
for(j=i*i; j<maxn; j+=i)//这里和打素数表有一点不同不是从i*i开始的,要是这样写程序会奔溃,
{
isprime[j] = nprime;
}
}
}
}


int main()
{
int n;
init();
while(scanf("%d",&n) != EOF)
{
printf("%d\n",isprime[n]);
}
return 0;
}

AC代码1:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

typedef long long ll;
using namespace std;
const int maxn = 1e6+10;

int isprime[maxn];

void init()
{
int i,j;
int nprime = 0;
memset(isprime,-1,sizeof(isprime));
isprime[1] = 0;
for(i=2; i<maxn; i++)
{
if(isprime[i] == -1)
{
nprime++;
for(j=i; j<maxn; j+=i)
{
isprime[j] = nprime;
}
}
}
}


int main()
{
int n;
init();
while(scanf("%d",&n) != EOF)
{
printf("%d\n",isprime[n]);
}
return 0;
}

AC代码2:

#include<stdio.h>
int a[1000000]={0};
int main()
{
int i,j,l=0,n;
a[1]=0;
for(i=2;i<1000000;i++)
{
if(!a[i])
{
l++;
for(j=i;j<1000000;j+=i)
{
a[j]=l;
}
}
}
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",a[n]);
}
return 0;
}


程序更简洁



举报

相关推荐

0 条评论