进制变换 ,大神来帮忙看看哪里错了。。

__103__ 2013-04-26 01:10:34
输入一个十进制数,将它分别转变成2进制 和 8进制的数。

下面是我的代码。
#include<stdio.h>
#include<math.h>
int change(int x,int y)
{
int i,r;
unsigned long int result=0;
for(i=0;x>0;i++)
{
r=x%y;
x=x/y;
result=result+r*pow(10,i);
}
return result;
}

int main ()
{
int a;
while(scanf("%d",&a)!=EOF)
printf("%ld\n%ld\n",change(a,2),change(a,8));
return 0;
}


在输入1204的时候,转变的2进制的数字就出错了。。why?
...全文
81 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
微型蚂蚁 2013-04-27
  • 打赏
  • 举报
回复
用字符串吧。就像上面说的。
赵4老师 2013-04-26
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main() {
    int i,v;
    char bs[33];
    char b[33];
    char hs[9];
    char h[9];
    char s[4];
    char *e;

// 十进制整数转二进制串;
    i=1024;
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("i=%d,bs=%s\n",i,bs);
// 十进制整数转十六进制串;
    i=1024;
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("i=%d,hs=%s\n",i,hs);
// 十六进制字符串转成十进制数
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    printf("hs=%s,i=%d\n",hs,i);
// 二进制字符串转化为十六进制字符串;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("bs=%s,hs=%s\n",bs,hs);
// 二进制字符串转化为十进制数;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    printf("bs=%s,i=%d\n",bs,i);
// 十六进制字符串转成二进制串
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("hs=%s,bs=%s\n",hs,bs);
// ASC\GBK字符串转十六进制串
    strcpy(s,"a汉");
    i=0;
    while (1) {
        if (0==s[i]) break;
        sprintf(hs+i*2,"%02X",(unsigned char)s[i]);
        i++;
    }
    setlocale(LC_ALL,"chs");
    printf("s=%s,hs=%s\n",s,hs);
// 十六进制字符串转成汉字(GBK)及字符(ASC)
    strcpy(hs,"61BABA");
    i=0;
    while (1) {
        if (1!=sscanf(hs+i*2,"%2x",&v)) break;
        s[i]=(char)v;
        i++;
    }
    s[i]=0;
    printf("hs=%s,s=%s\n",hs,s);

    return 0;

}
//i=1024,bs=00000000000000000000010000000000
//i=1024,hs=00000400
//hs=00000400,i=1024
//bs=00000000000000000000010000000000,hs=00000400
//bs=00000000000000000000010000000000,i=1024
//hs=00000400,bs=00000000000000000000010000000000
//s=a汉,hs=61BABA
//hs=61BABA,s=a汉
mujiok2003 2013-04-26
  • 打赏
  • 举报
回复
a不能太大了。

#include<stdio.h>
#include<math.h>
unsigned long long  change(unsigned int x,unsigned int y)
{
  unsigned long long result = 0, base = 1;
  while(x)
  {   
    result +=  (x % y) * base; 
    x /= y;
    base *= 10;
  }
  return result;
}

int main ()
{
  int a = 1024;
  while(scanf("%d",&a) == 1)
    printf("%lld\n%lld\n",change(a,2),change(a,8));
  return 0;
}
mujiok2003 2013-04-26
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<math.h>
unsigned long long  change(unsigned int x,unsigned int y)
{
  unsigned long long result = 0, base = 1;
  while(x)
  {   
    result +=  (x % y) * base; 
    x /= y;
    base *= 10;
  }
  return result;
}

int main ()
{
  int a = 1024;
  while(scanf("%d",&a)!=2)
    printf("%lld\n%lld\n",change(a,2),change(a,8));
  return 0;
}

mujiok2003 2013-04-26
  • 打赏
  • 举报
回复
引用 2 楼 mujiok2003 的回复:
1024 = 2^10, 所以是"10000000000",当成10进制数超过(32位系统)unsigned long的最大值4,294,967,296
2,147,483,647,不是4,294,967,296
__103__ 2013-04-26
  • 打赏
  • 举报
回复
引用 1 楼 piaobotudou 的回复:
#define INT_MAX 2147483647 超出了范围
那我弱弱地问下,应该怎么改啊?
微型蚂蚁 2013-04-26
  • 打赏
  • 举报
回复
二进制的1024是 10 000 000 000不能用int存储了
mujiok2003 2013-04-26
  • 打赏
  • 举报
回复
1024 = 2^10, 所以是"10000000000",当成10进制数超过(32位系统)unsigned long的最大值4,294,967,296
微型蚂蚁 2013-04-26
  • 打赏
  • 举报
回复
#define INT_MAX 2147483647 超出了范围

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧