判断101-200之间有多少个素数,并输出所有素数。哪位高手能帮忙详细的解释下这个程序

判断101-200之间有多少个素数,并输出所有素数。谁能帮忙详细的解释下这个程序
判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
      则表明此数不是素数,反之是素数。       
2.程序源代码:
#include "math.h"
main()
{
 int m,i,k,h=0,leap=1;
 printf("\n");
 for(m=101;m<=200;m++)
  { k=sqrt(m+1);
   for(i=2;i<=k;i++)
     if(m%i==0)
      {leap=0;break;}
   if(leap) {printf("%-4d",m);h++;
        if(h%10==0)
        printf("\n");
        }
   leap=1;  }
 printf("\nThe total is %d",h);
}

leap这个变量有什么用
红色的这一段是什么意思

------解决方案--------------------
leap 就是为了看 m%i==0 这个是否成立。。

这是很简单的if语句啊,大哥

刚开始 leap = 1; 但如果 m%i==0 的话 leap = 0; 了 之后break就跳出了哪个if语句

很明显,接下来的 if(leap) 是错的,也就

{
printf("%-4d",m);
h++;
   if(h%10==0)
  printf("\n");
        }
这里面的东西不执行了。。
接下来又是 leap = 1 ,其他的自己看吧
------解决方案--------------------
为了提高效率
for(m=101;m<=200;m++)
最好改成
for (m = 101; m <= 200; m += 2)
因为偶数肯定不是素数,所以 m += 2 可以剔除偶数

其他的我就没多看,也就不知道怎么能更好的提高效率
------解决方案--------------------
for (m = 101; m <= 200; m += 2)
改成
for (m = 101; m < 200; m += 2)
200肯定不是素数,就直接不用 = 了
------解决方案--------------------
为什么用sqrt(m)是因为,如果m是一个合数,那么它的所有因子都小于等于sqrt(m).
所以你判断2到sqrt(m)次就够了,不用判断那么多次。

------解决方案--------------------
leap就相当于一个标志可以设置成bool类型。如果是0则不用判断了,直接跳出循环。可是在你这里貌似可以不用这个标志位..这个变量属于多余
------解决方案--------------------
程序第4行为leap付初值leap=1(逻辑上的真)为下面的使用做准备
下面看红色部分:

    if(m%i==0) //如果m能被i整除就把leap的值置为0,然后跳出 for(i=2;i<=k;i++)这个循环

      {leap=0;break;}
   if(leap) {printf("%-4d",m);h++; //如果leap此时的值已经改变为0词语与逻辑为假直接跳过。如果此时leap的值为初始值1,则执行下面的语句块,输出m的值。h++的左右是计数(计算输出的素数的个数为下面的语句做准备)
        if(h%10==0) //如果h的值累积到能够被10整除的时候就输出换行,这样 做的好处是不会是输出的数据都堆在一行,而是没输出10个数据就自动换行。
        printf("\n");
        }
   leap=1;  } //在执行下一次for(m=101;m<=200;m++)
循环时把leap的值有置为1,如此循环知道m的值大于200结束。
最后统计输出100-200间素数的个数。
希望可以帮到你

------解决方案--------------------
leap是判断m能不能被I整除的,如果整除,直接break进行下一次循环,否则,继续判断2到sqrt(这个数),如果一直不能整除得到一个解,每break一次,leap重置为1;
------解决方案--------------------
C/C++ code

 { k=sqrt(m+1);   // 从2开始,到一个数的平方根为止
   for(i=2;i<=k;i++)
     if(m%i==0)
      {leap=0;break;}  // 如果此数能被上述范围之数整除,则不是素数,
                               // 将标志位 leap 复位,退出
   if(leap) {printf("%-4d",m);h++; // 如果是素数,标志位 leap == 1, 左对齐,4位宽 
        if(h%10==0)            // 每10个数字一行打印输出
        printf("\n");
        }
   leap=1;  }

------解决方案--------------------
这个题做的不对吧