啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!给忘了特判,我不知道1不是素数,2是素数!1不是素数啊啊啊啊!!!!1竟然不是素数!!!!2是素数!!!少了特判1的4分,好啊好。吃亏了长心了下次。简直惭愧,在考场上这道素数的题都没拿满分,10分得6分,该好好反思一下了。。。。。只是改了个特判条件就Ac了,我哭了真的555555
这个题没和其他题一样对输出的空格有严格要求,可以直接printf("Yes\n")和printf("No\n")。
2的31次方约为2*1e9。
第一有错版:
我看他数据范围很大就开了个long long谁知道其实这道题用不了那么大的数据。脑子里对素数的判断只有开根号和循环两个重要的点。考试的时候没有拿到全部的分。少了1的特判啊喂!我特判2干什么!就是基础不扎实,1和2记混了。。。
#include<stdio.h>
#include<string.h>
#include<math.h>
int n;
int main()
{
scanf("%d",&n);
while(n--){
long long t;
scanf("%lld",&t);
if(t == 2){
printf("Yes\n");
}
else{
int flag = 0;
for(int i = 2;i <= sqrt(t); i ++){
if(t % i == 0){
printf("No\n");
flag = 1;
break;
}
}
if(flag == 0)
printf("Yes\n");
}
}
return 0;
}
第二版代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
int n;
int main()
{
scanf("%d",&n);
while(n--){
long long t;
int flag = 0;
scanf("%lld",&t);
!!!!!!!!!!!!!!if(t == 1){!!!!!!!!!!!!!!
只是改了个特判条件,我哭了真的
printf("No\n");
}
else{
for(int i = 2;i <= sqrt(t); i ++){
if(t % i == 0){
printf("No\n");
flag = 1;
break;
}
}
if(flag == 0)
printf("Yes\n");
}
}
return 0;
}
第三版:
这里不用开long long,对1特判,1不是素数。对前三个数特判,除了1,其他2和3都是素数。其他情况在循环。如果有整除的,t % i == 0,也就是因数就退出循环。//如果这个数大于sqrt也就是从2到sqrt(t)的循环里没有满足条件的,也就是没有因数,则输出Yes,否则是No。
#include<stdio.h>
#include<string.h>
#include<math.h>
int n;
int main()
{
scanf("%d",&n);
while(n--){
int t;
int i;
scanf("%d",&t);
if(t == 1)//对1特判,1不是素数
printf("No\n");
else if(t <= 3)//对前三个数特判,除了1,其他2和3都是素数
printf("Yes\n");
else{//其他情况在循环
for(i = 2;i <= sqrt(t); i ++){//只要循环到i的根号下就可以了
if(t % i == 0 ){//如果有整除的,也就是因数
break;
}
}
if(i > sqrt(t)){//如果这个数大于sqrt也就是从2到sqrt(t)的循环里没有满足条件的,也就是没有因数,则输出Yes
printf("Yes\n");
}
else{//否则是No
printf("No\n");
}
}
}
return 0;
}
结果: