A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

[C] 纯文本查看 复制代码
printf("----------第一种写法-----------\n");
    
    printf("1--100间不包含7且不是7的倍数的数有:");
    for(int i = 0; i < 100; i++)
    {
        int res = (i % 7 != 0 && i / 10 != 7 && i % 10 != 7);
        if(res)
        {
            printf("%d  ",i);
        }
    }
    printf("\n");
    
    /*打印:
     1--100间不包含7且不是7的倍数的数有:1  2  3  4  5  6  8  9  10  11  12  13  15  16  18  19  20  22  23  24  25  26  29  30  31  32  33  34  36  38  39  40  41  43  44  45  46  48  50  51  52  53  54  55  58  59  60  61  62  64  65  66  68  69  80  81  82  83  85  86  88  89  90  92  93  94  95  96  99
    */
    /*
     虽然这样写结果没错,但是,人家要求的是1--100间的数,0明显不是1--100间的数
     也就只是这一题能得到正确结果,换了一题就未必了,例如:
     
     找出1--100间不包含7且是7的倍数的数
     这一题明显0是不在1--100之间的数,可是运行起来之后,结果里面会有0.
    */
    

7 个回复

正序浏览
本帖最后由 绕指柔荑 于 2016-10-11 13:57 编辑

这种事由于其他数据与被判断数据,  在某些特定条件下,  能实现相同的效果造成的.  
在程序调试的过程中,  要是出现了这种情况,  可以用以下方法排除:  

1. 将一个由多个判断条件组成的判断条件( 条件表达式 ) 每一个子判断条件分开,  例如:
[AppleScript] 纯文本查看 复制代码
i % 7 == 0 || i % 10 % 7 == 0 || i / 10 % 7 == 0 

改成:
[C] 纯文本查看 复制代码
int res1 = i % 7 == 0;
int res2 = i % 10 % 7 == 0;
int res3 = i / 10 % 7 == 0 ;
int res = res1 || res2 || res3;
2. 将断点打在int res1....那一行的上方, 逐句运行, 看到底是哪一个判断条件出现问题了
3. 发现问题之后就修改判断条件...没什么好说的
回复 使用道具 举报
[C] 纯文本查看 复制代码
printf("----------第二种写法-----------\n");
    
    printf("1--100间不包含7且不是7的倍数的数有:");
    
    for(int i = 0; i < 100; i++)
    {
                 // 7能整除i   ||    个位数 / 7    || 十位数 / 7
        int res = (i % 7 == 0 || i % 10 % 7 == 0 || i / 10 % 7 == 0 );
        if(res)
        {
            continue;
        }
        printf("%d  ",i);
    }
    printf("\n");
    
    /*打印(为了方便观察, 我将十位数相同的放在同一行了):
     
     11  12  13  15  16  18  19  
     22  23  24  25  26  29  
     31  32  33  34  36  38  39  
     41  43  44  45  46  48  
     51  52  53  54  55  58  59  
     61  62  64  65  66  68  69  
     81  82  83  85  86  88  89  
     92  93  94  95  96  99
     
     */
    
    /*
     
     先说下这种写法的思路吧:
        当 i % 7 = 0 || 个位数 / 7 = 0 || 十位数 / 7 = 0时,说明那个数不符合题意
        (我是说用这种写法的人是这么想的)
     
     然而, 他忽略了 0 除以任何数都为 0 ,即 :
         0 % 7 = 0, 所以01,02...09,以及10,20...90这些数中,
         某些明显数符合题意的数没能正确判断出来
     
     */
回复 使用道具 举报
忘记说了, 这个帖子是根据:

找出1--100间不包含7且不是7的倍数的数

这道题写的
回复 使用道具 举报
对了   第一种写法还有一个缺陷, 就是100没有进行判断, 当i = 100 时,循环体已经不执行了.
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
持续更新中, 未完待续......
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马