算法笔记3.5 问题 B: 数制转换
程序员文章站
2024-03-18 17:41:16
...
题目描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
输入
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
输出
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
样例输入
4 123 10
样例输出
27
提示
用字符串存储和表示不同进制的数。
注意:输入的时候大于10进制的数可能包含小写字母,这里是先转换成大写字母来完成的
#include<iostream>
#include<string>
#include<string.h>
#include<stdlib.h>
using namespace std;
int convert(char c,char asii[20]){
int pos=0;
for(int i=0;i<20;i++){
//cout<<c<<" "<<i;
if(c==asii[i] ){
//printf("%c->%d",c,i);
pos=i;
return pos;
}
}
pos=int(c - '0');
return pos;
}
int main() {
char asi[20]={0};
int begin=65;
for(int i=10;i<=15;i++){
//A:65--90
asi[i]=begin;
begin++;
}
int a,c;
char b[100];
while(scanf("%d %s %d",&a,b,&c)!=EOF){
//对b进行预处理 ,先全转化为大写字母,再转换为对应数字
int b1[100]={0};
for(int i=0;i<strlen(b);i++){
if (b[i]>='a'&&b[i]<='z'){
b[i]-=32;
}
b1[i]=convert(b[i],asi);
}
//将b转换为十进制y
int y=0,product=1,lenth=strlen(b);
while(lenth--){
y=y+b1[lenth]*product;
product*=a;
//printf("%d\n",lenth);
}
//将十进制y数转为c进制
int z[40]={0},pos=0;
do
{
z[pos++]=y%c;
y=y/c;
}while(y!=0);
for(int i=pos-1;i>=0;i--){
if(z[i]>=10){
printf("%c",asi[z[i]]);
}else{
printf("%c",(char)(z[i]+'0'));
}
}
printf("\n");
}
return 0;
}
上一篇: 各进制间的转换
下一篇: Unity Input类型