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

来源:互联网 发布:mac全屏快捷键设置 编辑:程序博客网 时间:2024/05/01 02:32

题目地址:点击打开链接

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

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

错误代码:

#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 0
原创粉丝点击