题目描述编写一个程序将指定进制2∼162 \sim 162∼16下的整数转换为另一种进制2∼162 \sim 162∼16下的整数。高于999的“数字”用单个大写字母表示例如101010用A\texttt{A}A151515用F\texttt{F}F等等。输入格式每行包含三个值第一个值正整数表示输入数字的进制第二个值正整数表示目标进制第三个值实际要转换的数字用第一个进制表示数字可能包含表示高于999的字母也可能包含无效的“数字”。每个数字不超过101010个字符。每行中的输入值之间至少有一个空格分隔。输出格式输出由原始数字后跟字符串base\texttt{base}base再跟原始进制后跟\texttt{}再跟转换后的数字后跟base\texttt{base}base再跟目标进制组成。如果原始数字无效则输出original_Value is an illegal base original_Base number样例输入2 10 10101 5 3 126 15 11 A4C样例输出10101 base 2 21 base 10 126 is an illegal base 5 number A4C base 15 1821 base 11题目分析问题的本质这是一个进制转换问题。需要验证输入数字在给定进制下是否合法每位数字小于进制数将合法数字转换为十进制数值将十进制数值转换为目标进制表示数字表示0∼90 \sim 90∼9字符0到910∼1510 \sim 1510∼15字符A到F输入数字最多101010个字符进制最大161616因此十进制数值最大约为1610≈1.1×101216^{10} \approx 1.1 \times 10^{12}1610≈1.1×1012在646464位整数范围内特殊处理数字0转换后仍为0无效数字任何位上的数字值≥\geq≥进制数参考代码// The Bases Are Loaded// UVa ID: 355// Verdict: Accepted// Submission Date: 2016-06-27// UVa Run Time: 0.000s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intmain(){ios::sync_with_stdio(false);string number;intbase1,base2;string digits0123456789ABCDEF;mapchar,intkey;// 建立字符到数值的映射for(inti0;idigits.length();i)key.insert(make_pair(digits[i],i));while(cinbase1base2number){// 验证数字是否合法boolisLegaltrue;for(inti0;inumber.length();i)if(key[number[i]]base1){isLegalfalse;break;}if(!isLegal){coutnumber is an illegal base base1 numberendl;continue;}// 转换为十进制longlongvalue0;for(inti0;inumber.length();i)valuevalue*base1key[number[i]];// 转换为目标进制string target;while(value0){target.insert(target.begin(),digits[value%base2]);value/base2;}// 处理值为 0 的情况if(target.length()0)target0;coutnumber base base1 target base base2endl;}return0;}