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的。
具体代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#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; }