| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1599 人关注过本帖
标题:各位大神 请问一下 这个为什么尾部会多一个0 啊?
只看楼主 加入收藏
hisia_
Rank: 2
等 级:论坛游民
帖 子:45
专家分:26
注 册:2016-1-24
结帖率:72.73%
收藏
已结贴  问题点数:10 回复次数:4 
各位大神 请问一下 这个为什么尾部会多一个0 啊?
十进制转二进制  为什么会多出一个0呀?运行第一个数的时候。。
题目:
Problem G: 十进制整数转二进制

Time Limit: 1 Sec  Memory Limit: 2 MB
Submit: 7814  Solved: 4472
[Submit][Status][Web Board]
Description

给出一个十进制的非负整数x,x<=216,把它转换成二进制数输出。

Input

输入为多行,每行一个整数x,至读入EOF结束。

Output

每行输出x对应的二进制数值。

Sample Input

0
1
3
33
65535
Sample Output

0
1
11
100001
1111111111111111
HINT

本题有多种解法:可以用循环迭代对2的除法和取余操作,不过处理的顺序与输出顺序相反,需要利用数组存储;用取对数或从大到小减去2的整数次幂的方法计算与输出顺序是相同的;也可以用printf()把十进制的数值处理成十六进制,然后1位十六进制转4位二进制;也可以用位运算处理。

代码:
#include <stdio.h>
#define N 65536
int main()
{
  int n,i,a[N],m,l=0;
  while(scanf("%d",&n)!=EOF)
  {
    if(n<0||n>65536)  break;
    else{
    while(n!=0)
    {
      a[l]=n%2;
      n=n/2;
      l++;
    }
    for(i=l;i>=0;i--)
    {
      printf("%d",a[l-1]);
      l--;
    }

    printf("\n");}
  }
  return 0;
}


请各位大神指教一下啊,,这个运行第一个数尾部会多出一个0是为什么?
搜索更多相关主题的帖子: 尾部 十进制 整数 输出 顺序 
2017-11-23 21:47
hisia_
Rank: 2
等 级:论坛游民
帖 子:45
专家分:26
注 册:2016-1-24
收藏
得分:0 
知道了。。那不应该等于0,等于0   后面就会多出一个0?但为什么只在第一个测试数上多一个0呢?各位大神  请指教一下 为什么啊??
2017-11-23 21:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:6 
至读入EOF结束
这个出题者也是个渣,EOF是返回值,是请求读数据时又没有数据可读而返回的一个错误值,并非是文件内容中有个叫EOF的char值被读出来了。
因为教者昏昏,所以学者才会写出 for( char ch; ch=getchar(), ch!=EOF; ) 这样的错代码

会正题,“为什么只在第一个测试数上多一个0呢?”,因为
for(i=l;i>=0;i--)
    {
      printf("%d",a[l-1]);
      l--;
    }
执行完毕后,l等于-1,下次循环的时候你又没有将l置0,写到a数组之前一位了,……,不多说,反正都是错误的。
总之吧,是一股脑将变量定义到前面的错,不同部分需要的变量混在一起,故意给自己制造麻烦。

我想告诉一件事:C标准早在上个世纪就不建议用户将不同局部的变量坨到一起了。
写个示范给你
程序代码:
#include <stdio.h>

int main( void )
{
    for( unsigned n; scanf("%u",&n)==1; )
    {
        if( n == 0 )
            puts( "0" );
        else
        {
            char s[10];
            char* p = s+10;

            for( *--p='\0'; n!=0; n/=2 )
                *--p = '0'+ n%2;

            puts( p );
        }
    }

    return 0;
}

2017-11-24 08:57
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:1 
用位运算:
#include <stdio.h>
#include <limits.h>
main()
{
    int i, n;
    while (scanf("%d",&n)==1)
    {
        for (i=sizeof(int)*CHAR_BIT-1; ((n>>i)&1)==0&&i>0; --i) NULL;
        for (; i>=0; --i)
            printf("%d", (n>>i)&1);
        printf("\n");
    }
}
2017-11-24 10:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:3 
参考了一下4楼的,其实还可以这样理解~

程序代码:

#include <stdio.h>
#include <limits.h>
int main( void )
{
    unsigned n;
    while (scanf("%u",&n)==1)
    {
        unsigned i=1<<(sizeof (int )*CHAR_BIT-1);
    
        while (!(i&n)&&(i>>=1));
        
        do
        {
            printf("%u",!!(i&n));
        }while (i>>=1);
    
        
        puts("");
    }
    
    return 0;
}


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-11-24 13:29
快速回复:各位大神 请问一下 这个为什么尾部会多一个0 啊?
数据加载中...
 
   



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

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