大整数进制转换

题目描述:

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

输入:

多组数据,每行为一个长度不超过30位的十进制非负整数。

(注意是10进制数字的个数可能有30个,而非30bits的整数)

输出:

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

样例输入:
0
1
3
8
样例输出:
0
1
11
1000
来源:
2008年北京大学软件所计算机研究生机试真题
1.自己想的解法特别的复杂

#include<stdio.h>
#include<string.h>
//基本思路,先把大整数拆成几个部分,用二进制算最终结果
int DtoB (char b[],char str[],int len){//转十进制到二进制
    int tmp=0;
    int i;
    if(len==0) {
        b[0]=0;
        return 0;
    }
    for(i=len-1;i>=0;--i){
        tmp*=10;
        tmp+=(str[i]-‘0‘);
    }
    i=0;
    do{
        b[i++]=tmp%2+‘0‘;
        tmp/=2;
    }while(tmp!=0);
    b[i]=0;
    return i;//返回位数
}
int Badd(char b1[],int size1,char b2[],int size2){//二进制加法,最终放在b2,从低位到高位
    int i;
    int c;//进位
    int x;
    if(size1<=size2){
        c=0;
        for(i=0;i<size1;i++){
            x=c+b1[i]-‘0‘+b2[i]-‘0‘;
            b2[i]=x%2+‘0‘;
            c=((x>=2)?1:0);
        }
        for(i=size1;i<size2;i++){
            x=c+b2[i]-‘0‘;
            b2[i]=x%2+‘0‘;
            c=((x>=2)?1:0);
        }
        if(c==1) b2[i++]=‘1‘;
        b2[i]=0;
        return i;
    }
    else{
        c=0;
        for(i=0;i<size2;i++){
            x=c+b1[i]-‘0‘+b2[i]-‘0‘;
            b2[i]=x%2+‘0‘;
            c=((x>=2)?1:0);
        }
        for(i=size2;i<size1;i++){
            x=c+b1[i]-‘0‘;
            b2[i]=x%2+‘0‘;
            c=((x>=2)?1:0);
        }
        if(c==1) b2[i++]=‘1‘;
        b2[i]=0;
        return i;
    }
}
int Bmul(char b[],int len){//二进制乘以10
    char bmul2[100];//原来的二进制乘二,就是右移一位
    int i;
    for(i=len;i>=0;i--){//包括\0右移
        bmul2[i+1]=b[i];
    }
    bmul2[0]=‘0‘;//第0位补0
    for(i=len;i>=0;i--){//乘8,右移3位
        b[i+3]=b[i];
    }
    b[0]=b[1]=b[2]=‘0‘;
    int size=Badd(bmul2,len+1,b,len+3);//最终结果在b里面,size返回大小
    return size;

}

int main(){
    char str[31];//大整数
    while(scanf("%s",str)!=EOF){

        int size=strlen(str);
        char str1[11],str2[11],str3[11],str4[11];//把十进制字符串拆成4段str1->str3 低位到高位 9位9位分割
        int i,j,size1=0,size2=0,size3=0,size4=0;
        for (i=0;i<11;i++){
            str1[i]=‘0‘;
        }
        for (i=0;i<11;i++){
            str2[i]=‘0‘;
        }
        for (i=0;i<11;i++){
            str3[i]=‘0‘;
        }
        for (i=0;i<11;i++){
            str4[i]=‘0‘;
        }

        for(size1=0,j=size-1;size1<9&&j>=0;++size1,--j){
            str1[size1]=str[j];
        }
        str1[size1]=0;
        for(size2=0;size2<9&&j>=0;++size2,--j){
            str2[size2]=str[j];
        }
        str2[size2]=0;
        for(size3=0;size3<9&&j>=0;++size3,--j){
            str3[size3]=str[j];
        }
        str3[size3]=0;
        for(size4=0;size4<9&&j>=0;++size4,--j){
            str4[size4]=str[j];
        }
        str4[size4]=0;

        char b1[150],b2[150],b3[150],b4[150];//二进制形式的各段,0位放最低位二进制—>高
        int b1_size=DtoB(b1,str1,size1);
        int b2_size=DtoB(b2,str2,size2);
        int b3_size=DtoB(b3,str3,size3);
        int b4_size=DtoB(b4,str4,size4);
        //int sizea=Badd(b2,b2_size,b1,b1_size);//以上都正确
        //int sizea=Bmul(b2,b2_size);//
        if(b2_size!=0){
            for(i=0;i<9;i++){
                b2_size=Bmul(b2,b2_size);
            }
            b1_size=Badd(b2,b2_size,b1,b1_size);
        }
        if(b3_size!=0){
            for(i=0;i<18;i++){
                b3_size=Bmul(b3,b3_size);
            }
            b1_size=Badd(b3,b3_size,b1,b1_size);
        }
        if(b4_size!=0){
            for(i=0;i<27;i++){
                b4_size=Bmul(b4,b4_size);
            }
            b1_size=Badd(b4,b4_size,b1,b1_size);
        }

        for(i=b1_size-1;i>=0;--i){
            printf("%c",b1[i]);
        }
        printf("\n");

    }

return 0;
}

2.在网上看到大整数十进制转六进制的解法(来源:十进制大整数转换成十六进制数

Description

将十进制数转换成十六进制数。

Input

包括多组测试数据。输入一个不超过100位正整数,无前导零。

输入以0结束。

Output

输出其十六进制表示(不打印前导零,A~F字母大写)。

Sample
Input

12
20
12345678901234567890
0

Sample Output

C
14
AB54A98CEB1F0AD2
原理:16的倍数乘以625一定能被10000整除,那么一个整数乘以625所得数的最后4位除以625所得值等价于这个整数对16取余。
#include<stdio.h>
#include<string.h>
void main()
{
    int i,j,a[110],b[110],t;
    char s[105];
    while(gets(s),strcmp(s,"0")){
        strrev(s);
        for(i=0;i<110;i++)a[i]=b[i]=0;
        for(i=0;s[i];i++)a[i]=s[i]-48;//将字符转化为数字
        for(t=1;t<100;t++){
            for(i=0;i<110;i++)a[i]*=625;
            for(i=0;i<110;i++){
                if(a[i]>9){
                    a[i+1]+=a[i]/10;
                    a[i]%=10;
                }
            }
            b[t]=(a[0]+a[1]*10+a[2]*100+a[3]*1000)/625;//求余数
            for(i=0;i<105;i++)a[i]=a[i+4];//去掉余数
        }
        for(;!b[t]&&t>1;t--);//去掉前导零
        for(;t;t--)printf("%X",b[t]);
        puts("");
    }
}

3.用相似的原理

时间: 2024-08-05 03:20:48

大整数进制转换的相关文章

整数进制转换

一.使用包装类Integer的toOctalString,toHexString,toBinaryString方法,实现八进制,十六进制和二进制的格式转换. System.out.println(Integer.toOctalString(Integer.parseInt("12345678"))); System.out.println(Integer.toHexString(Integer.parseInt("12345678"))); System.out.p

整数进制转换机制

实例说明 由于计算机的特殊结构,其内部使用二进制数据.为了节约空间,有定义了八进制和十六进制格式来表示二进制数据.一个八进制数可以表示3位二进制数,一个十六进制数可以表示4位二进制数.而对于普通人而言,使用十进制更容易阅读. 关键技术 Integer类设计的初衷是为了在基本数据类型和引用数据类型之间建立一个桥梁,然而类库的设计者发现,可以将很多有用的方法也放在该类中. Integer常用的方法 toBinaryString(int i) 返回指定数字i的二进制表示形式 toOctalString

[CODEUP] 1943 进制转换

题目描述 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 输入 多组数据,每行为一个长度不超过30位的十进制非负整数.(注意是10进制数字的个数可能有30个,而非30bits的整数) 输出 每行输出对应的二进制数. 样例输入 0 1 3 8 样例输出 0 1 11 1000 IDEA 长整数用字符串形式存储,主要解决的问题是字符串如何进行除法和余数.余数不用多说,就是最后一位余2就行.除法则应该按照平时手算除法的顺序进行,比如: for (i = 0; i < len - 1;

poj2305-Basic remains(进制转换 + 大整数取模)

进制转换 + 大整数取模一,题意: 在b进制下,求p%m,再装换成b进制输出. 其中p为b进制大数1000位以内,m为b进制数9位以内二,思路: 1,以字符串的形式输入p,m; 2,转换:字符串->整数 十进制->b进制; 3,十进制下计算并将整形结果转换成字符串形式,并倒序储存; 4,输出.三,步骤: 1,输入p[],m[]; 2,字符串->整形 + 进制->b进制: i,进制转换语句:m2 = m2*b + m[j]-'0'; ii,大整数取模,大整数可以写成这样的形式: 12

03 php 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换,算术运算,比较运算

03 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换, 算术运算,比较运算,逻辑运算,短路现象, 三目运算符,字符型运算: 数据类型 整体划分 标量类型: int, float, string, bool 复合类型: array,     object 特殊类型: null,     resouce 整数类型int, integer 3种整数表示法 十进制写法:123: $n1 = 123; 八进制写法: 0123 $n2 = 0123; 十六进制写法: 0x123 $n3

【ACM】大数据+任意进制转换 jobdu 1080

[九度OJ] 1080 进制转换 题目描述: 将M进制的数X转换为N进制的数输出. 输入: 输入的第一行包括两个整数:M和N(2<=M,N<=36).下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出. 输出: 输出X的N进制表示的数. 样例输入: 16 10 F 样例输出: 15 提示: 输入时字母部分为大写,输出时为小写,并且有大数据. 这题考察的比较综合,进制转换+大数据 很久没有做ACM的题目了,且拿这个练练手,大整数模板是用的王道论坛的模板-贴出来备

超长整数的基础运算 算法实现之进制转换篇

十进制转二进制 由于单个"位"采用的是216-1作为理论最大值,因此在本次大整数的表示过程中每个类似"十进制"位可采用16位的二进制来表示,符号位单独表示. "十"进制转换成二进制,实际上是经过中间状态(即大整数的逻辑存储表示)转化.在转换过程中大整数的每个"位"无耦合,不存在依赖关系,因此实现方式较为单一,即采用十进制数进行不断除2得余数的方式组成二进制的结果.需要特别注意的是二进制字符串不足16位的需要在高位用"

利用java中的BigInteger实现进制转换

[原创] java中的进制BigInteger十分的强大,而且好用,他可以表示任意大的整数,同时还可以进行进制转换,十分的方便, 代码示例: 1 package com.jiajia.demo_1; 2 import java.math.BigInteger;//导入该包 3 public class Demo { 4 public static void main(String[] args) { 5 String str = new BigInteger("15", 10).toS

进制转换问题

package jinzhizhuanhuan; import java.math.BigInteger; import java.util.Scanner; /** * 题目意思很简单,实现16以内的进制之间的转换,将一个n进制的数转换为一个m进制的数. 输入:每行包括3个字符串,第一个表示要转换的n进制的数,第二个表示基数n,第三个表示基数m 输出:屏幕按格式显示七位的转换结果,如果多于七位,输出" ERROR" * @author Administrator * */ publi