为了账号安全,请及时绑定邮箱和手机立即绑定

哪位大神解释一下,n不是应该<=m么

n<m的话你就取不到m,n就不会等于m,如果这个数是素数,应该会return 0吧 但是程序能跑出素数,求解

正在回答

6 回答

不会取不到m的,我们可以一步步来看。

1 在第一个for语句的第一个表达式中,便将2赋予了m;

2 然后判断第二个表达式m<=50(此时m=2),值为1(即 结果为真);

3 然后执行第一个for语句的循环体语句中的第一个语句:第二个for语句;

4 在第二个for语句的第一个表达式中,将2赋予了n(此时m=2);

5 然后判断第二个for语句的第二个表达式n<m(此时n=2,m=2),值为0(即 结果为假),不执行第二个for语句的循环体语句(即 第一个if语句),因此也不执行第二个for语句的第三个表达式(因为for语句的第三个表达式要在执行完循环体语句后才执行),此时m,n仍为2;

6 然后执行第一个for语句的循环体语句中的第二个语句(即 第二个if语句);

7 判断第二个if语句的表达式m==n(此时m,n均为2),值为1(即 结果为真),所以执行第二个if语句的语句(即 显示“2 ”);

8 此时第一个for语句的循环体语句已经执行完第一次,开始执行第三个表达式m++,使m=3,接着又回到第二个表达式m<=50,值为1,又开始第二次循环.......

8 回复 有任何疑惑可以回复我~
#1

慕粉9166412 提问者

谢谢您!当n=m时,直接执行最后一个if语句
2018-07-01 回复 有任何疑惑可以回复我~
#2

闲默_

谢谢大佬搭救
2018-08-17 回复 有任何疑惑可以回复我~
#3

Yttwindstyle

按照您的思路3也可以顺利输出,但是再往后走就有问题了 输出m=3之后m执行第一个for语句的第三个代码自增成为4,判断m<=50为真,进入第二个for循环。 此时n=3,m=4,n<m成立,进行第二个for循环的if判断4%3==0结果为假,故n执行第二个for循环的第三块代码自增成为4 然后就会进行第一个for循环的if判断m==n,此时m=n=4,这输出不就有问题了么 希望大佬能解惑,我是哪一个地方思考出问题了吗?
2018-08-17 回复 有任何疑惑可以回复我~
#4

慕无忌6163732

膜拜大佬
2018-12-28 回复 有任何疑惑可以回复我~
查看1条回复

其实n<=m其中的"="相当于画蛇添足,如果是一个素数的话在n<m的时候,由于n++使得n=m直接不满足内循环中的n<m了,而没使用break;

直接跳到到for(m==n)从而输出素数。如果n<=m相当于在前面的基础上多运算了一步然后break;到for(m==n),发现由于n++,n是大于m的还是没输出来。所以对于输出的素数来说n<=m,n<m都没关系

0 回复 有任何疑惑可以回复我~

m为什么等不到4呢

0 回复 有任何疑惑可以回复我~

因为N++,所以在跳出循环后n可能会等于m。

0 回复 有任何疑惑可以回复我~
#include <stdio.h>
#include <math.h>
int main(){    
    int m, n,flag;    
    for(m=2; m<=50;m++)    
    {		
        for(n=2; n<=sqrt(m); n++)        
        {            
            if(flag=(m%n==0)) break;		
        }		
        if(flag) continue;        
        printf("%d  ", m);	
     }	
     return 0;    
}


0 回复 有任何疑惑可以回复我~

何止不用取到m,取到m的平方根就够了,不过取到平方根代码要改

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

哪位大神解释一下,n不是应该<=m么

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信