| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 720 人关注过本帖
标题:一个小问题,请高手帮忙
只看楼主 加入收藏
核晴核理
Rank: 3Rank: 3
来 自:北京
等 级:论坛游侠
帖 子:129
专家分:169
注 册:2012-6-14
结帖率:84.21%
收藏
已结贴  问题点数:20 回复次数:14 
一个小问题,请高手帮忙
#include<math.h>
void main()
{
    int i,j,k,h=0,leap=1;
    for(i=101;i<=200;i++)
    {
        k=sqrt(i+1);
        for(j=2;j<=k;j++)
        if(i%j==0)
        {
            leap=0;break;}
             if(leap)
            {
                printf("%-4d",i);h++;
                  if(h%10==0)
                 printf("\n");
              }
          leap=1;
        }
printf("\nThe total is %d",h);        
}
程序中倒数第四行得leap=1在程序中起什么作用?
2012-06-25 17:07
核晴核理
Rank: 3Rank: 3
来 自:北京
等 级:论坛游侠
帖 子:129
专家分:169
注 册:2012-6-14
收藏
得分:0 
坛子里的高手进来帮帮忙啊,新手学习中
2012-06-25 18:12
s18270722463
Rank: 2
等 级:论坛游民
帖 子:53
专家分:28
注 册:2012-6-11
收藏
得分:0 
判断作用
2012-06-25 18:32
菜鸟0
Rank: 2
等 级:论坛游民
帖 子:37
专家分:91
注 册:2012-6-20
收藏
得分:0 
这个作用如下:for(i=101;i<=200;i++)
    {
        k=sqrt(i+1);
        for(j=2;j<=k;j++)
        if(i%j==0)        当第一个i%j!=0时执行(1),执行完之后会输出一个数
            leap=0;break;} 然后leap一直等于1,当遇到第一个i%j==0时,会把leap
 (1)          if(leap)              变为0,此后没有把leap变为1,而直接跳
            {                           出了第二重循环,i的值加一。当再次遇
                printf("%-4d",i);h++;    i%j!=0时,本来应该执行(1)的。但
                  if(h%10==0)             leap=0;就不会输出数了。        
                 printf("\n");   之后才将leap=1;这样的话就会少输出一
              }                          个数。当下次i%j==0时,又会leap=0;
          leap=1;                   然后跳出,i再加一,当i%j!=0时,
printf("\nThe total is %d",h);      又不执行(1)。这样
                                   每次都会少输出一个。                    
2012-06-25 19:04
菜鸟0
Rank: 2
等 级:论坛游民
帖 子:37
专家分:91
注 册:2012-6-20
收藏
得分:10 
不知道你这个程序是用什么功能。。每次都要少输出一个数。。。
2012-06-25 19:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
呵呵,那你四楼那些分析有什么用?

小朋友们的代码阅读能力还有待提高。我想还是量不够。

程序是在输出100到200之间的素数。

重剑无锋,大巧不工
2012-06-25 19:23
柳邢文
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2012-6-25
收藏
得分:0 
我认为在此程序中有两个用途 1确保申请的数据不是垃圾值。2作为判断条件
2012-06-25 20:34
核晴核理
Rank: 3Rank: 3
来 自:北京
等 级:论坛游侠
帖 子:129
专家分:169
注 册:2012-6-14
收藏
得分:0 
回复 6楼 beyondyf
版主,能帮忙分析下吗,四楼的兄弟说的我了解了一点,但感觉还是很朦胧,版主让我茅塞顿开吧
2012-06-26 07:16
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
读代码和读文章一样,不是把所有字认下来就算读懂了。读代码也要联系上下文。
另外,良好的代码风格可以使阅读变得轻松愉悦。
程序代码:
for(i=101;i<=200;i++)
{
    k=sqrt(i+1);
    for(j=2;j<=k;j++)
        if(i%j==0)
        {
            leap=0;
            break;
        }
    if(leap)
    {
        printf("%-4d",i);
        h++;
        if(h%10==0)
            printf("\n");
    }
    leap=1;
}
printf("\nThe total is %d",h); 
先看第一个循环,知道i是一个101至200之间的数。记到这儿。
进入循环体,第一句k是i+1的2次方根。
之后,下一个循环,j从2开始到k循环。其实你看代码多了到这儿就已经知道它在干什么了。这是在测试i是否为素数。
进入循环体,果然是在判断i对j的余数。余数为0,则将leap置为0,跳出j循环。由此知leap是个标志,当i是合数时会被置为0。
j循环结束后,一个条件块,如果leap为真则打印i的值,并累加一个变量h。由此知h在计数i的个数。之后的两句是输出格式控制。
到了i循环的末尾,重新置leap为1,以进行下一轮的判断。否则,leap被之前置0后,就一直为0了。

总之,这段代码逻辑上没错,但太冗余。有很多不必要的东西。个人观点,解决同一个问题,水平越低,代码越长。

让我写,代码将是这样的。
程序代码:
#include<stdio.h>
#include<math.h>
int main()
{
    int i, j, k, c;
    for(c = 0, i = 101; i <= 200; i += 2)
    {
        for(k = sqrt(i), j = 3; j <= k && i % j; j += 2);
        if(j > k) printf("%d%c", i, ++c % 10 ? ' ' : '\n');
    }
    return 0;
}      

重剑无锋,大巧不工
2012-06-26 08:37
震中地带
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:171
专家分:359
注 册:2012-3-26
收藏
得分:0 
回复 楼主 核晴核理
第一个if语句的作用是判断i能否被j整除,若能,则将leap置为零,(注意这儿将leap置为0)则不进行第二个if语句,为了可以进行下一次判断,当然要在所有判断语句后将leap置为1,否则第二个if语句只会执行一次
2012-06-26 08:59
快速回复:一个小问题,请高手帮忙
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046031 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved