题目描述我们可以用这样的方式来表示一个十进制数将每个阿拉伯数字乘以一个以该数字所处位置为指数以101010为底数的幂之和的形式。例如123123123可表示为1×1022×1013×1001 \times 10^22\times 10^13\times 10^01×1022×1013×100这样的形式。与之相似的对二进制数来说也可表示成每个二进制数码乘以一个以该数字所处位置为指数以222为底数的幂之和的形式。一般说来任何一个正整数RRR或一个负整数−R-R−R都可以被选来作为一个数制系统的基数。如果是以RRR或−R-R−R为基数则需要用到的数码为0,1,…,R−10,1,\dots,R-10,1,…,R−1。例如当R7R7R7时,所需用到的数码是0,1,2,3,4,5,60,1,2,3,4,5,60,1,2,3,4,5,6这与其是RRR或−R-R−R无关。如果作为基数的数绝对值超过101010则为了表示这些数码通常使用英文字母来表示那些大于999的数码。例如对161616进制数来说,用AAA表示101010用BBB表示111111用CCC表示121212以此类推。在负进制数中是用 $-R $ 作为基数例如−15-15−15十进制相当于(110001)−2(110001)_{-2}(110001)−2−2-2−2进制并且它可以被表示为222的幂级数的和数(110001)−21×(−2)51×(−2)40×(−2)30×(−2)20×(−2)11×(−2)0(110001)_{-2}1\times (-2)^51\times (-2)^40\times (-2)^30\times (-2)^20\times (-2)^1 1\times (-2)^0(110001)−21×(−2)51×(−2)40×(−2)30×(−2)20×(−2)11×(−2)0设计一个程序读入一个十进制数和一个负进制数的基数并将此十进制数转换为此负进制下的数。输入格式输入的每行有两个输入数据。第一个是十进制数nnn。第二个是负进制数的基数RRR。输出格式输出此负进制数及其基数若此基数的绝对值超过101010则参照161616进制的方式处理。输入输出样例 #1输入 #130000 -2输出 #13000011011010101110000(base-2)输入输出样例 #2输入 #2-20000 -2输出 #2-200001111011000100000(base-2)输入输出样例 #3输入 #328800 -16输出 #32880019180(base-16)输入输出样例 #4输入 #4-25000 -16输出 #4-250007FB8(base-16)说明/提示数据范围对于100%100\%100%的数据−20≤R≤−2-20 \le R \le -2−20≤R≤−2∣n∣≤37336|n| \le 37336∣n∣≤37336。题目解析代码功能将十进制整数n转换为r进制数r可以是负数核心思路1.递归转换函数zhuan(n, r)voidzhuan(intn,intr){if(n0)return;// 递归终止条件intmn%r;// 取余数if(m0)m-r,nr;// 处理负数取余的问题if(m10)mAm-10;// 将10以上的余数转为A-Felsem0;// 将0-9转为字符zhuan(n/r,r);// 递归处理高位printf(%c,m);// 输出当前位return;}2.关键处理负数取余修正if(m0)m-r,nr;这是最巧妙的部分为什么需要这个在C中负数取余结果可能是负数如-5 % 2 -1但在进制转换中余数应该始终为非负数通过m-r将负余数转为正数同时nr调整被除数3.执行示例以n10, r2为例zhuan(10,2): m0 → 0 zhuan(5,2): m1 → 1 zhuan(2,2): m0 → 0 zhuan(1,2): m1 → 1 zhuan(0,2): return 输出1 输出0 输出1 输出0 结果1010(base2)4.主函数流程intmain(){intn,r;cinnr;// 输入数字和进制coutn;// 输出格式zhuan(n,r);// 递归转换printf((base%d),r);// 输出进制return0;}算法特点递归实现从低位到高位处理但输出时从高位到低位处理负进制支持r为负数的情况字符处理10-15转为’A’-‘F’格式规范输出如 “101010(base2)” 的标准格式【贴上代码~】#includeiostream#includecstdio#includecmath#includecstringusingnamespacestd;voidzhuan(intn,intr){if(n0)return;intmn%r;if(m0)m-r,nr;if(m10)mAm-10;elsem0;zhuan(n/r,r);printf(%c,m);return;}intmain(){intn,r;string ans;cinnr;coutn;zhuan(n,r);printf((base%d),r);return0;//完结撒花}