欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

转进制的问题

程序员文章站 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为二进制结果图
转进制的问题

相关标签: 暂时放置