为什么要判断i≤m?

img


为什么要判断i≤m?之前for循环里不是已经对于m的取值范围有条件限制了吗?判断质数跟i与m之间的大小有什么关系呀?

比如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;
} 


img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/1103778
  • 你也可以参考下这篇文章:矩阵:请写一个程序,对于一个m行m列(2<m<20)的方阵,求其每一行、每一列及主、辅对角线元素之和,然后按照从大到小的顺序依次输出这些值。
  • 除此之外, 这篇博客: 最详细讲解指针中的 Ⅱ . 指向由m个元素组成的一维数组的指针变量 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 定义指向由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;
    }
    

    打印结果如下:
    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    在判断质数时要限制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。