转进制的问题
程序员文章站
2022-05-29 18:29:49
...
进制转换我们都知道方法,这里就用代码来实现一下,x进制转换到y进制(其范围为2到62进制之间转换,‘A’到‘Z’表示10–35,‘a’到‘z’表示36到62)
这里实际上是用到了大数相乘的思想,就是高精度乘低精度的基础算法,具体以代码显示
*
*
*
简单说明两个函数
inio()函数就是把各类进制转为十进制数,怎么做呢?
就跟大数阶乘做法一样,数组的q[0]存的是低位上的数字,因为最后你要进位,直接在数组末尾加上就行,方便多了;每一位读取的数字进行转换后都放进q[0]的位置上,然后再for一遍,目的是为了使q[]数组上的每一个元素的值都不超过10(这里也可以进行压位操作,节省数组空间),最后把q[]数组反转。
*
func()函数就是把十进制的数转为目标进制的数,其做法就跟我们说的除基取余操作一样,代码中的sum变量主要是记录当前剩余的值是多少,如果为0就代表这个大数已经操作完成
# include <iostream>
# include <string>
# include <algorithm>
using namespace std;
int x,y;
string z;
int q[10000]; //数组大小看题意
char ans[10000];//数组大小看题意,这里只是为了演示
int inio(){
int k=1;
for(int i=0;i<z.size();++i){
for(int j=0;j<k;++j) q[j]*=x; //这里每次迭代需要乘以相应的进制
if(z[i]>='0'&&z[i]<='9') q[0]+=z[i]-'0';
else if(z[i]>='A' && z[i]<='Z') q[0]+=z[i]-'A'+10;
else q[0]+=z[i]-'a'+36;
int c = 0;
for(int j=0;j<k;++j){
q[j]+=c;
if(q[j]>=10){
c = q[j]/10;
q[j]%=10;
}else
c = 0;
}
while(c){
q[k++] = c%10;
c/=10;
}
}
for(int i=0,j=k-1;i<j;++i,--j)
q[i]^=q[j]^=q[i]^=q[j];
return k;
}
void func(int k){
// cout<<k<<endl;
int sum=1;
int right=0;
while(sum){
sum=0;
for(int i=0;i<k;++i){
int d = q[i]/y;
sum+=d;
if(i==k-1){
int t = q[i]%y;
if(t>=0 && t<10) ans[right++] = t+'0';
else if(t>=10 && t<=35) ans[right++] = t+'A'-10;
else ans[right++] = t+'a'-36;
}else{
q[i+1]+=q[i]%y*10;
}
q[i] = d;
}
}
for(int i=right-1;i>=0;--i) cout<<ans[i];
}
int main(void)
{
cin>>x>>y>>z;
int k = inio();
func(k);
return 0;
}
十六进制转FB为二进制结果图
上一篇: 真是一个人渣
下一篇: 报错:两个类有同一个xml类型名字。。。