永远不要去责怪你人生里的任何人,
好的人给你快乐,坏的人给你经历,
最差的人给你教训,最好的人给你回忆。–徐峥
题目描述
进制转换 | 时间限制:1秒 | 内存限制:32768K
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10 用A表示,等等)
示例1: 输入 7 2 输出 111
题目解析
本题题目很简单,题目的本意就是将10进制的数转换成N进制。N(2 ≤ N ≤ 16)可以看出进制最多可以到16进制。
解题思路
本题思路很简单,首先想清楚原理:N进制数,每个进制位的值分别是X0* N^ 0,X1* N^ 1, X2* N^2…,X0, X1,X2就是这些进制位的值,就是就是进行取模余数就是当前低进制的位的值是多少,通过除掉进制数,进入下一个进制位的计算。
解法一
#include <iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
string s, table="0123456789ABCDEF";
int m,n;
cin>>m>>n;
bool flag = false;
// 如果是负数,则转成正数,并标记一下
if(m < 0) {
m = 0 - m;
flag = true;
}
// 按进制换算成对应的字符添加到s
while(m){
s += table[m%n];
m /= n;
}
if(flag){
s += '-';
}
reverse(s.begin(), s.end());
cout<<s<<endl;
return 0;
}
/*
-75
6
m:-75 n:6
s: -203
99
6
m:99 n:6
s: 243
*/
解法二
#include <iostream>
#include <string>
using namespace std;
int main(){
string s = "", table = "0123456789ABCDEF";
int m, n;
cin >> m >> n;
cout << "m:" << m << " " << "n:" << n << endl;
while (m){
if (m<0){
m = -m;
cout << "-" << endl;
}
s += table[m%n];
m /= n;
}
reverse(s.begin(), s.end());
cout << "s: " << s << endl;
system("pause");
return 0;
}
/*
-75
6
m:-75 n:6
-
s: 203
*/