| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 486 人关注过本帖
标题:计数程序出错了
只看楼主 加入收藏
njzhangyuhao
Rank: 2
等 级:论坛游民
帖 子:197
专家分:35
注 册:2010-11-20
结帖率:100%
收藏
 问题点数:0 回复次数:6 
计数程序出错了
统计a与b之间所有数中1出现的次数    每次输2个数 但是输入0 0后 程序死机 好想死循环了 不知道为什么
#include<stdio.h>
#include<math.h>
void main()
{
    long a[501],b[501],n,i,j,k;
    a[0]=1;
    b[0]=1;
    for(n=0;a[n]!=0||b[n]!=0;)
    {
        n++;
        scanf("%ld%ld",&a[n],&b[n]);
    }
    for(i=1;i<n;i++)
    {
        k=0;
        for(j=a[i];j<=b[i];j++)
        {
            for(;j!=0;j/=10)
            {
                if(j%10==1)
                    k++;
            }
        }
        printf("%ld\n",k);
    }
}
搜索更多相关主题的帖子: 统计 
2011-04-02 20:33
yoy
Rank: 2
等 级:论坛游民
帖 子:29
专家分:24
注 册:2011-3-9
收藏
得分:0 
for(j=a[i];j<=b[i];j++)
        {
            for(;j!=0;j/=10)
这里的问题 j永远不等与0 当j=0时 j又加了1
所以你应该 个 s=j;
for(;s!=0;s/=10)
2011-04-02 21:20
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:0 
从语法上讲,我是没看出什么错误。
不过首先,怎么也得保证b[i]>=a[i],总要有个判断输入吧

我的地盘
2011-04-02 21:21
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:0 
呵呵,看了楼上的评论,我懂了,是永远跳不出外面那个循环,j一直在0和1之间徘徊

我的地盘
2011-04-02 21:24
bccn250
Rank: 5Rank: 5
等 级:职业侠客
帖 子:154
专家分:379
注 册:2010-5-25
收藏
得分:0 
第一组数就输入0 0应该不会死机吧,还有就是输入第一个数比第二个数大也不会死机 比如 6 5 然后再 0 0
应该是第一组输入 两个非零的数并且前一个数小于第二个数,然后再输入 0 0会死循环

想一想,第一次输入非零的数,也就是说,第一次输入的数最小也会 是 1 1 以上

然后看看第二层循环的条件,  j<=b[i],
这里我们以 i 为 1 进入这个循环(因为最外层循环里 i 是等于 1 进入的)
假如我第一次输入 5 5 ,循环条件为真,进入循环体,
然后 这时候 j 是等于 5,第三层的循环条件也为真,进入第三层循环体
第三层的循环的最后一部份是 j/=10 ,循环条件是 j!=0
再大的整数 进行循环除十 j/=10 ,最后都是等于 0,所以再最后一定会退出第三层循环,不是死在第三层里
退出第三层循环后 j 一定是等于 0 的,因为第三层的条件是 j!=0
这时候 j 等于 0 然后执行第二层的 j++ 也就是等于 1
再看看上面红色的那句 因为这时候 还没到最外层循环,所以 i++ 还没执行,
i 还是 1 ,b[1]是输入的第一组数的其中一个,所以它肯定大于 等于 1
这时候 j 等于 1 , b[i]也等于 1,j<=b[i] 为真,继续循环
然后再进入第三层,出来之后 j又是 0 ,然后又 j++ ,j又等于 1,然后 j<=b[i] 又为真,如此反复,所以死在这

for(j=a[i];j<=b[i];j++)
{
   for(;j!=0;j/=10)
   {
      if(j%10==1)
         k++;
   }
}
2011-04-02 22:39
bccn250
Rank: 5Rank: 5
等 级:职业侠客
帖 子:154
专家分:379
注 册:2010-5-25
收藏
得分:0 
简单说就是

因为输入第一组数不是 0 0 所以 b[1] 一定大于等于 1

然后,退出第三层循环之后 j 一定是等于 0,然后执行 j++ 就等于 1了,

j 等于 1 ,b[1]最小也是 1 所以 j<=b[1] 永远为真,所以跑不出去
2011-04-02 22:48
yoy
Rank: 2
等 级:论坛游民
帖 子:29
专家分:24
注 册:2011-3-9
收藏
得分:0 
3楼的馒头脸貌似是刘亦菲?!  好像没我漂亮
2011-04-03 00:24
快速回复:计数程序出错了
数据加载中...
 
   



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

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