题解 P1017 【进制转换】

· · 题解

这道题唯一的难点就是

题目写不清楚

而且题解也没写清楚

对负进制不了解

(于是我百度了回来)

首先,不管对于什么语言,

被除数=商*除数+余数,

这是解决问题的关键

例如在C++里,-15%-2=-1,-15/-2=7,而7*-2+(-1)=-15

但是因为我们是不断取余数倒序为转换结果,所以余数不能出现负数,那怎么办呢?

很简单虽然我一开始看不懂

我们只需要将商+1,余数-除数即可,因为余数(绝对值)一定小于除数,所以这样就可以将余数装换为正数

正确性证明:

(商+1)*除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数

于是就可以愉快的做题啦

#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;
}