大整数转换为其他进制数

    xiaoxiao2021-03-25  111

    如何对 一个1000位(即 10999 )以内的十进制大数M进行进制K(K<=16)的转换。 思路分析: 对一个大数M的存储可以利用字符串string来存储输入,并且在这里使用string相对于数组来说,更容易操作。 我们需要模拟M除以K和M对K取余操作。 从第一位开始,对M每一位M[i]表示的整数进行判断。 如果M[i] < <script type="math/tex" id="MathJax-Element-546"><</script>K,就商零。【如果在第一位,也商0,那么M/K的结果就可能有前导码0,需要怎么办?剔除掉。】 如果M[i] <= <script type="math/tex" id="MathJax-Element-547"><=</script>K,就商M[i]/K。 但无论是怎样,M[i]%K的值是给下一位的借位,因此我们可以设置一个变量cp,保存本次M[i]%K的值即cp=M[i]%K,在进行下一位运算前,加上 上一位借给本位的值即M[i-1]+(10*cp)。

    【代码如下】:

    #include<iostream> #include<string> using namespace std; char ch[16]= { '0','1','2','3','4','5','6','7', '8', '9', 'A','B','C','D','E','F' };//保存0-16 的表示。 string toeasy(string x)//用来剔除前导码0的函数; { int len=x.length(); int count=0; for(int i=0;i<len;i++) { if(x[i]!='0') { break; } else count++; } x=x.substr(count,len); return x; } // 返回x/k的商(字符串类型),data[*datalen]保存本次的余数。 string dev(string x,int k,int data[],int *datalen) { int len=x.length();//字符x的长度; int rp=0;//记录是否会给下一位进位。 默认没有 for(int i=0;i<len;i++) { int temp=x[i]-'0';//x第i位上的值; temp=rp*10+temp;// 加上上为留下的进位权值。 rp=0;//要重新复试为0; if(i==len-1) { data[*datalen]=temp%k;//最后一位时,计算余数; (*datalen)++;//引用传递是双向传递,更改后的datalen值, //可以返回给实参datelen。 } if(temp>=k) { x[i]=temp/k+'0';//+'0'是为了统一为数字字符。0的Assiic=48 } if(temp<k) { x[i]='0'; } rp=temp%k; } return x; } int main() { string str; int data[100];//保存每次除模取余的余数 int k=16; while(cin>>str) { int datalen=0; for(;str!="";) { str=toeasy(dev(str,k,data,&datalen)); } for(int i=datalen-1;i>=0;i--)//输出转换后的进制。 cout<<ch[data[i]]; cout<<endl; } }
    转载请注明原文地址: https://ju.6miu.com/read-24033.html

    最新回复(0)