6

数的进制转换

思路

考虑使用短除法进行进制转换。短除法的步骤是:对于一个 a 进制数,可以每次对其 ÷b,每次获取余数写成一排,最后翻转即是答案。考虑证明一下这一点。对于一个数为 xn1×an1+xn2×an2++x1×a1+x0×a0,那么每次短除,就是得到最后一位,每次除,就是去掉最后一位,其实和其他进制转十进制原理相同。这道题还需要高精度。

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int T;
int main(){
	cin>>T;
	while(T--){
		int a,b;
		string line_a;
		cin>>a>>b>>line_a;
		printf("%d %s\n",a,line_a.c_str());
		printf("%d ",b);
		vector<int>c;
		for(char v:line_a){
			if(isdigit(v))c.push_back(v-'0');
			else if(isupper(v))c.push_back(v-'A'+10);
			else c.push_back(v-'a'+36);
		}
		reverse(c.begin(),c.end());
		vector<int>ans;
		while(!c.empty()){
			int t=0;
			for(int i=c.size()-1;~i;--i){
				c[i]+=t*a;
				t=c[i]%b;
				c[i]/=b;
			}
			ans.push_back(t);
			while(!c.empty()&&!c.back())c.pop_back();
		}
		reverse(ans.begin(),ans.end());
		for(int v:ans){
			if(v<10)putchar(v+'0');
			else if(v<36)putchar(v-10+'A');
			else putchar(v-36+'a');
		}
		puts("\n");
	}
    return 0;
}

本文作者:wscqwq

本文链接:https://www.cnblogs.com/wscqwq/p/17153730.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wscqwq  阅读(13)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起