OJ_1138 进制转换

来源:互联网 发布:solaris scp linux 编辑:程序博客网 时间:2024/05/21 04:22
#include <stdio.h>  #include <string.h>     char str[100];//输入字符串  int start[100],ans[100],res[100]; //被除数,商,余数     //转换前后的进制  const int oldBase = 10;  const int newBase = 2;     void change()  {//各个数位还原为数字形式      int i,len = strlen(str);      start[0] = len;      for(i=1;i<= len;i++)      {          if(str[i-1] >= '0' && str[i-1] <= '9')          {              start[i] = str[i-1] - '0';          }      }   }     void solve()  {      memset(res,0,sizeof(res));//余数初始化为空      int y,i,j;      //模n取余法,(总体规律是先余为低位,后余为高位)      while(start[0] >= 1)      {//只要被除数仍然大于等于1,那就继续“模2取余”          y=0;          i=1;          ans[0]=start[0];          //          while(i <= start[0])          {              y = y * oldBase + start[i];              ans[i++] = y/newBase;              y %= newBase;           }          res[++res[0]] = y;//这一轮运算得到的余数          i = 1;          //找到下一轮商的起始处          while((i<=ans[0]) && (ans[i]==0)) i++;          //清除这一轮使用的被除数          memset(start,0,sizeof(start));          //本轮得到的商变为下一轮的被除数          for(j = i;j <= ans[0];j++)              start[++start[0]] = ans[j];           memset(ans,0,sizeof(ans)); //清除这一轮的商,为下一轮运算做准备      }   }     void output()  {//从高位到低位逆序输出      int i;      for(i = res[0];i >= 1;--i)      {            printf("%d",res[i]);      }      printf("\n");   }     int main()  {      while(scanf("%s",str)!=EOF){;      change();      solve();      output();     // getchar();   }    return 0;  }   

有更通用的写法,但基本上也是模R取余

大数取余的过程注意,可以参考另外一个通用的进制转换题目,找找看,网速太慢了,下次链接起来// TODO


题目描述:

将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

输入:

多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)

输出:

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

样例输入:
0138
样例输出:
01111000

0 0