题目一:输入一个正整数m,判断是否是素数。
思路一: 素数指只能被1和其本身整除,比如13只能被1和13整除,假如有整数m, 在2~m-1(包括1与m-1)存在某个数n,使得m % n = 0
; 那么m就不是素数。
代码如下(编程语言是C):
#include <stdio.h>
int main()
{
int i,m;
scanf("%d", &m); //输入正整数 m;
for(i = 2; i <= m-1; i++){
if(m % i == 0){ //遍历[2,m-1],判断 m % i 是否为0;若为0,直接break强制退出循环,执行
printf("%d 不是素数!", m); //for循环的下一语句,即if语句
break;
}
}
if(i == m) //上一for语句主要是判断[2,m-1]是否存在被 m 整除的数,如果没有,
printf("%d 是素数!", m); //说明m是素数,此时i == m(因为m除以i不等于0的最后一个数i是m-1
system("pause"); // 经过i++后i == m),所以可通过i == m来输出素数
return 0;
}
思路二: 思路一中的 [ 2, m-1 ] 区间可缩小到 [ 2, m / 2 ] ,是因为m不可能被大于 m/2 的数整数。并且在数学上还可以证明,该区间还可缩小为[ 2, sqrt(m) ]。
代码如下(编程语言是C):
#include <stdio.h>
int main()
{
int i,m;
scanf("%d", &m);
for(i = 2; i <= m/2; i++){
if(m % i == 0){
printf("%d 不是素数!", m);
break;
}
}
if(i == m/2 + 1) //最关键一步;如果m为素数,就代表m除以i,直到i == m/2,m都不能整除[ 2, m-1 ] 里任意一个数,此时再经过i++后,
printf("%d 是素数!", m); //i== m/2 + 1,然后通过if语句判断输出素数
system("pause");
return 0;
}
思路三(2019/4/21添加的方法):
#include<stdio.h>
int main(void) {
int N, i, j = 0;
scanf("%d",&N);
if (N >= 3 && N <= 10000) {
for (i = 2; i <= N / 2; i++) {
if (N % i == 0)
j++;
}
}
if (j == 0)
printf("prime\n");
else
printf("not prime\n");
return 0;
}