【解题报告】洛谷P1017 进制转换

题目链接

https://www.luogu.com.cn/problem/solution/P1017

思路

我们知道进制的转换是可以从十进制转换到其他进制的

所以我们考虑是怎么转换的

假设数字为 nn ,我们要把它转化成 kk 进制的话,我们就要对其进行一波操作,每次对它进行魔(模)法,剩下来的数字就是他的对应的进制位置上的数字,举个例子,比如192转化为八进制
192 mod 8=0192/8=2424 mod 8=024/8=33 mod 8=3 192 \space mod \space 8=0 \\ 192 /8=24 \\ 24 \space mod \space 8 =0 \\ 24/8=3 \\ 3 \space mod \space 8=3
然后从下往上倒序输出就是 300(8)300_{(8)}

还原回去
3×82=192 3 \times 8^2=192
成立,所以说明我们的方法是对的

然后我们考虑负数,负数魔法有余数小于零怎么办啊

那我们就类似于借位,把余数借成正数再输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
int n,r;
char s[100005];
int len;
int main()
{
cin>>n>>r;
cout<<n<<"=";
while(n!=0)
{
int divi=n%r;
n/=r;
if(divi<0)
divi-=r,n++;
if(divi<10)
s[++len]=(char)(divi+48);
else
s[++len]=(char)((divi-10)+'A');
}
for(int i=len;i>=1;i--)
putchar(s[i]);
cout<<"(base"<<r<<")"<<'\n';
return 0;
}