高精度的进制转换

来源:互联网 发布:网上贷款软件排行 编辑:程序博客网 时间:2024/06/15 07:48
1 #include <stdio.h> 2 #include <string.h> 3  4 char str[1000];//输入字符串 5 int start[1000],ans[1000],res[1000]; //被除数,商,余数 6 //res[]存的是余数,其最后结果的逆序为所求的结果 7 //转换前后的进制 8 const int oldBase = 10; 9 const int newBase = 2;10 11 void change()12 {13     //各个数位还原为数字形式14     int i,len = strlen(str);15     start[0] = len;16     for(i=1; i<= len; i++)17     {18         if(str[i-1] >= '0' && str[i-1] <= '9')19         {20             start[i] = str[i-1] - '0';21         }22     }23 }24 //start[0]存的是串的长度,其他元素为被除数的每一位25 void solve()26 {27     memset(res,0,sizeof(res));//余数初始化为空28     int y,i,j;29     //模n取余法,(总体规律是先余为低位,后余为高位)30     while(start[0] >= 1)31     {32         //只要被除数仍然大于等于1,那就继续“模2取余”33         y=0;34         i=1;35         ans[0]=start[0];36         //从第一位开始处理每一位(被除数=上一轮得到的余数*新的进制数+当前位的数)37         while(i <= start[0])38         {39             y = y * oldBase + start[i];40             ans[i++] = y/newBase;41             y %= newBase;42         }43         res[++res[0]] = y;//这一轮运算得到的余数44         i = 1;45         //找到下一轮商的起始处46         while((i<=ans[0]) && (ans[i]==0)) 47             i++;48         //清除这一轮使用的被除数49         memset(start,0,sizeof(start));50         //本轮得到的商变为下一轮的被除数51         for(j = i; j <= ans[0]; j++)52             start[++start[0]] = ans[j];53         memset(ans,0,sizeof(ans)); //清除这一轮的商,为下一轮运算做准备54     }55 }56 void output()57 {58     //从高位到低位逆序输出59     int i;60     for(i = res[0]; i >= 1; --i)61     {62         printf("%d",res[i]);63     }64     printf("\n");65 }66 67 int main()68 {69     scanf("%s",str);70     change();71     solve();72     output();73     return 0;74 }复制代码 
0 0
原创粉丝点击