比如i为4,m从2开始遍历,4%2==0成立,break跳出循环,此时i>m说明不是质数,如果是质数的话一直没有整除的,m最后会递增到i,此时i≤m输出是质数
判断i<=m的目的是确认for循环是否正常退出,如果正常退出就是质数。
如果能整除就会提前结束循环,最好把i<=m改为i==m这样更容易理解。
判断i<=m是为了判断m的值是否超过了(i-1),因为质数是除1和自身之外无其他因数的自然数,当m大于等于i,则说明2到(i-1)没有一个数可以整除i,则i是素数;
for循环里面的对m的取值范围作的限制,即保证m遍历到2到(i-1)之间的每一个数;
i和m之间的关系是,如果m的值大于等于i, 则说明区间内(2到i-1)的任意一个数都不能整除i,说明i是素数,如果m的值小于i,则说明区间内有数可以整除i,则说明i不是素数;
第一个if可以改一下,当i小于2时,输出提示信息后,return退出程序即可,因为小于2的数都不是素数。
测试如下:
参考链接:
#include <stdio.h>
int main(void){
int i,m;
scanf("%d",&i);
if(i<2){ // 当i小于2,输出提示信息,然后return退出程序
printf("输入的数据错误");
return -1;
}
// https://baike.baidu.com/item/%E8%B4%A8%E6%95%B0/263515
for(m=2;m<i;m++){ // 遍历2到(i-1) 内的每一个数(2是特例 )
if(i%m==0){ // 当区间内任意一个数可以整除i,则break退出循环
break;
}
}
if(i<=m){ // 当m大于等于i,说明2到(i-1)内的每一个数都不能整除i,则i是素数 (2是特例 )
printf("%d是质数",i);
}else{ // 否则不是素数
printf("%d不是质数",i);
}
return 0;
}
定义指向由m个元素组成的一维数组的指针变量的格式:
类型 (*指针变量名) [m]
行指针变量 列数
如:
int a[5][7];
int (*p)[7];
p=a;
char b[ 10][80];
char (*r)[80];
r=b+5;
上面伪代码解析代码如下:
/*
int a[5][7];
int (*p)[7];
p=a;
*/
#include<stdio.h>
int main() {
int a[4][4]; //定义一个二维数组
int (*p)[4]; //定义一个一维数组的指针变量,也就是说该数组是指向某一行第四列的一维数组
int *c; //普通的指针变量
p=a; //将二维数组的首地址赋值给p,也就是说此时的p是指向的a的首行,且(*p)[4]等价于p[0][4]
printf("%p\n%p\n",a,p); //打印数组a的首地址和p的首地址
printf("%d ",sizeof(a)); //打印数组a所占的空间,也就是二维数组a[4][4]所占的空间
printf("%d ",sizeof(*p)); //打印数组p所占的空间,也就是一维数组p[0][4]所占的空间
printf("%d ",sizeof(c)); //打印指针变量(地址变量)c所占的空间,
printf("\n\n");
return 0;
}
打印结果如下:
/*
char b[ 10][80];
char (*r)[80];
r=b+5;
*/
#include<stdio.h>
#include<string.h>
int main() {
char b[10][80]; //定义一个二维数组
char (*r)[80]; //定义一个一维数组的指针变量,也就是说该数组是指向某一行第八十列的一维数组
r=b+5; //将b[0][0]向下移动五行再赋值给r,也就是将a[5][0]的地址赋值给r。
printf("%p\n%p\n",r,b[5]); //打印地址
printf("%d ",sizeof(*r)); //查看空间
printf("%d ",sizeof(b[5]));//查看空间
return 0;
}
打印结果如下:
在判断质数时要限制i≤m是因为判断质数的方法是遍历从2到sqrt(num)之间的所有数,看是否能整除,如果能整除就不是质数。如果i超过了m的值,即大于sqrt(num),那么i*i就肯定大于num了,就没有必要再判断了。
下面是一个判断质数的具体解决方案的伪代码:
def isPrime(num):
if num <= 1:
return False
for i in range(2, int(num**0.5)+1):
if num % i == 0:
return False
return True
其中,num为待判断的数,函数返回True表示为质数,返回False表示不是质数。对于每个数i,从2到sqrt(num)之间遍历,判断是否能整除num,如果能整除则说明num不是质数,返回False;如果遍历完都没有找到能整除的数,则说明num是质数,返回True。