转进制的问题

进制转换我们都知道方法,这里就用代码来实现一下,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为二进制结果图
十六进制FB转为二进制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值