http://10.16.23.21:8080/JudgeOnline/showproblem?problem_id=3794

(1)暑假集训的时候死活没有AC的题目。

(2)其实一开始我的思路就是对的,先算出小范围(20万)以内的所有素数,保存起来,用这些素数作为判定位置数据的素数与否的依据。是的,一开始就是对的!!

(3)错误的原因有两个方面:

    1)__int64.  为此,所有的int被我换成了__int64,保证了正确性。(虽然并不提倡)

    2)" not less than"

      是:

for(i=n;;i++)

      而不是:

for(i=n+1;;i++)

    其实一开始是对的,后来脑子就。。抽了。。。。

总的来说,当时状态并不好,才会让这个简单题WA的。

具体代码:

View Code
#include<stdio.h>
#include<math.h>
#include<string.h>
__int64 tot, prime[20000];
__int64 is_prime(__int64 n)
{
    if(n==1) return 0;
    __int64 m=sqrt(n);
    for(__int64 i=2;i<=m;i++)
        if(n%i==0) return 0;
    return 1;
}
__int64 yes(__int64 n)
{
    if(n==1) return 0;
    __int64 i;
    for(i=0;i<tot;i++)
    {
        if(n==prime[i]) return 1;
        if(n%prime[i]==0) return 0;
    }
    return 1;
}
int main()
{
    tot=0;
    for(__int64 i=2;i<=200000;i++)
        if(is_prime(i))
            prime[tot++]=i;
    __int64 i, n, t;
    while(scanf("%I64d", &t)!=EOF)
    {
        while(t--)
        {
            scanf("%I64d", &n);
            for(i=n;;i++)
            {
                if(yes(i)) break;
            }
            printf("%I64d\n", i);
        }
    }
    return 0;
}