上网看进制转换都是各种繁琐代码
可是数学解法就很简洁。
如 12(10)转N(2)
12/2=6 ...... 0
6/2=3 ...... 0
3/2=1 ...... 1
1/2=0 ...... 1
如图:
所以12(10)=1100(2) 注意!!是倒序输出
那么此时就可以把他放入数组并倒序输出
#include<bits/stdc++.h>
using namespace std;
// 取余
int main(){
int a[10001]={};
long long num,N,i=0;
cin >> num >> N;
while (num) {
int temp = num%N;
num/=N;
a[i++]=temp;
}
for (int j=0;j<i;j++) {
cout << a[i-j-1];
}
return 0;
}
但这样有个bug,转十以上进制时,要用字母,如
123(10)=N(16)
123/16=7 ......11(B)
7/16=0 ......7
123(10)=7B(16)
如下表
字母 | A | B | C | D | E | F |
十进制 | 10 | 11 | 12 | 13 | 14 | 15 |
二进制 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
八进制 | 12 | 13 | 14 | 15 | 16 | 17 |
所以将数组更改为char型
char a[10001]={};
同时进行判断,大于十时用 A+余数-10 来求出字母,否则直接加上0
这样是为了让所有数都转为char型(当然,直接用数组也可以,只要强转char就好)
if (s>=10) a[i++]=char('A'+s-10);
else a[i++]=char(s+'0');
完整代码
#include<bits/stdc++.h>
using namespace std;
// 取余
int main(){
char a[10001]={};
long long num,n,i=0;
cin >> num >> n;
while (num) {
int s = num%n;
num/=n;
// 英文输出判断j
if (s>=10) a[i++]=char('A'+s-10);
else a[i++]=char(s+'0');
}
for (int j=0;j<i;j++) {
cout << a[i-j-1];
}
return 0;
}
这道题也是洛谷 B2141 的解,但注意,num一定要设为long long 不然又一个点过不去。
虽然这样的时间复杂度不是最快的,但简单好写。我自己认为比网上那些快但难懂的好。