输入一个十进制整数N,将它转换成R进制数输出。(2<=R<=16, R!=10)
题目:输入一个十进制整数N,将它转换成R进制数输出。(2<=R<=16, R!=10)
思路:辗转相除法:
这样我们就很清楚地知道是N一直在除以2,直至被除数为0。
我们就将余数储存在一个数组里,到时候再将数组逆序输出
其它进制也一样,不过是除数改变而已。!!!
所以步骤就是:
1.将余数储存在数组里 2.将数组逆序输出
代码:
/*输入一个十进制数N,将它转换成R进制数输出。R(2<=R<=16, R!=10) */ #include<iostream> #include<cmath> using namespace std; int main() { int n, r;//n为数,r为进制 int a[10000]; char b[10000]; while (cin >> n >> r)//循环输入样例 { if (n == 0) break; if (r < 2 || r>16) { cout << "INPUT ERROR!"; break; } int t = 0, i = 0; int k = abs(n);//先用abs函数求出绝对值 //进制小于10 if (r < 10) { while (k != 0)//辗转相除法 { t = k % r; a[i] = t; i++; k = k / r; } if (n > 0)//若n为正数 { for (int j = i - 1;j >= 0;j--)//倒序输出 { cout << a[j]; }
cout << endl; } if (n < 0)//n为负 { a[i - 1] = a[i - 1] * (-1); for (int j = i - 1;j >= 0;j--) { cout << a[j]; } cout << endl; } } //进制大于10 if (r > 10) { while (k != 0) { t = k % r; if (t > 9) { if (t == 10) b[i] = 'A'; if (t == 11) b[i] = 'B'; if (t == 12) b[i] = 'C'; if (t == 13) b[i] = 'D'; if (t == 14) b[i] = 'E'; if (t == 15) b[i] = 'F'; } else { b[i] = t + 48;//数组b为字符数组,且0的ASCII码是48,要将b字符转化为0 - 9,所以加了48 } i++; k = k / r; } if (n > 0) { for (int j = i - 1;j >= 0;j--) { cout << b[j]; } cout << endl; } if (n < 0) { cout << "-"; for (int j = i - 1;j >= 0;j--) { cout << b[j]; } cout << endl; } } } }
相关补充(超详细的进制转换知识详解):https://www.cnblogs.com/sqm724/p/12694754.html