题解 P1017 【进制转换】
老卡手机
2018-07-27 21:46:50
这道题唯一的难点就是
### ~~题目写不清楚~~
### ~~而且题解也没写清楚~~
## 对负进制不了解
(于是我百度了回来)
首先,不管对于什么语言,
### 被除数=商*除数+余数,
这是解决问题的关键
例如在C++里,-15%-2=-1,-15/-2=7,而7*-2+(-1)=-15
但是因为我们是不断取余数倒序为转换结果,所以余数不能出现负数,那怎么办呢?
很简单~~虽然我一开始看不懂~~
我们只需要将商+1,余数-除数即可,因为余数(绝对值)一定小于除数,所以这样就可以将余数装换为正数
正确性证明:
```
(商+1)*除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数
```
于是就可以愉快的做题啦
```cpp
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
void zhuan(int n,int r)
{
if(n==0) return ;
int m=n%r;//m为余数
if(m<0) m-=r,n+=r;//如果余数小于0,转化为正数
//将余数转化为ascll码方便输出,省略了一个数组
if(m>=10) m='A'+m-10;
else m+='0';
zhuan(n/r,r);
printf("%c",m);//注意,因为结果为余数倒序,输出要写在递归后面,不然会顺序输出
return ;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,r;
string ans="";
cin>>n>>r;
cout<<n<<"=";
zhuan(n,r);
printf("(base%d)",r);
return 0;
}
```