题目描述
一个大于 1 的自然数,如果除了 1 和它自身外,不能被其他自然数整除则称该数为素数,又叫质数。
例如 7 就是一个素数,因为它只能被 1 和 7 整除。
现在,给定你 一 个大于 1 的自然数,请你判断是否是素数。
输入格式
一个自然数 X。(1<n<=2×10^7)
输出格式
如果测试数据是质数,则输出 X is prime,其中 X 是测试数据。
如果测试数据不是质数,则输出 X is not prime,其中 X 是测试数据。
样例输入1
3
样例输出1
3 is prime
样例输入2
8
样例输出2
8 is not prime
完整代码:
#include<bits/stdc++.h>
using namespace std;
int n;
bool prime(int n){
if(n==2)return 1;
for(int i=2;i<=n/i;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
int main(){
cin>>n;
if(prime(n))printf("%d is prime\n",n);
else printf("%d is not prime\n",n);
}
#include<bits/stdc++.h>
using namespace std;
int n;
bool prime(int n){
if(n==2||n==3){
return 1;
}
if(n%6!=1 && n%6!=5) {
return 0;
}
for(int i=5;i<=n/i;i+=6){
if(n%i==0||n%(i+2)==0){
return 0;
}
}
return 1;
}
int main(){
cin>>n;
if(prime(n))printf("%d is prime\n",n);
else printf("%d is not prime\n",n);
}
分析:
根据素数的定义,一个大于 1 的自然数,如果除了 1 和它自身外,不能被其他自然数整除
2 是合数
if(n==2)return 1;
一个大于 1 的自然数n,不能被除1和它本身数i 整除n%i!=0
for(int i=2;i<=n;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
其实 i<=n/i 就可以了,因为因数总是成对出现的
bool prime(int n){
if(n==2)return 1;
for(int i=2;i<=n/i;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
优化一下:
令x>=1,将>=5的自然是表示如下:
... | 6x-1 | 6x | 6x+1 | 6x+2 | 6x+3 | 6x+4 | 6x+5 | 6x+6 | ... |
... | 6x | 2(3x+1) | 3(2x+1) | 2(3x+2) | 6(x+1) | ... |
素数都在6的倍数的两侧~
所以步长可定为6 (QaQ)
bool prime(int n){
if(n==2||n==3){
return 1;
}
if(n%6!=1 && n%6!=5) {
return 0;
}
for(int i=5;i<=n/i;i+=6){
if(n%i==0||n%(i+2)==0){
return 0;
}
}
return 1;
}
完结撒花~