例5002 进制转换
Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)
Total Submissions: 190 Accepted Submissions: 39
Problem Description
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16,R<>10)。
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
Sample Input
7 2
23 12
-4 3
Sample Output
111
1B
-11
我们先来复习一下10进制整数转换为其他进制的方法:
(1)把我们要转换的数除以新的进制的基数,把余数作为新进制的最低位;
(2)把上一次得到的商再除以新的进制基数,把余数作为新进制的次低位;
(3)继续上一步,直到最后的商为零,这时的余数就是新进制的最高位。
注意,我们的递归函数的输出刚好是从上面的第(3)步中输出最高位开始的,也就是说,递归最先算出来的是新进制的最高位,然后才依次计算后面较低的位
#include <iostream>
using namespace std;
//可以用递归来解决这个问题的原因是:递归输出时是逆向输出的,即从递归结束的那条语句的前一句开始输出
//这正好和进制转换的方法对应了起来
int base(int n,int k)
{char m;//注意,这里用一个char类型来存要输出的数字字符,即把数值输出替换为字符输出 if(n == 0)return 0;//递归结束 base(n/k,k); m = (n%k>9?'A'+n%k-10:n%k+'0');//如果余数大于9,则按16进制那一套来记 printf("%c",m);
}int main()
{int num;int r;while(~scanf("%d %d",&num,&r)){if(num<0) {cout<<"-";//如果是负数,则先输出一个负号 base(-num,r);//注意这里的传值是 -num }elsebase(num,r);cout<<endl;}return 0;
}