<2>进制转换问题

1.正进制

哪有啥正进制...只为了区分负进制而标定的罢了。

进制问题都可以表示为倒序输出原数/进制数的余数,不论正进制还是负进制,计算上被除数=除数*商+余数是确定的(下面负进制会用到)

于是在求正进制的时候只需要表示倒序输出余数就可以了。

2.负进制

这个结论是前人总结的,就是在求负进制的时候只需要同样按照正进制来算,区别在:商+1 并且 余数-除数。

正确性证明:

商*除数+余数=被除数

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

所以成立。

下面以NOIP2000年A题为例:

#include<cstdio>
#include<iostream>
using namespace std;
void f(int x,int y){
    if(x==0) return;
    int m=x%y;
    if(m<0){
        m=m-y;x+=y;
    }
    if(m>=10){
        m='A'+m-10;
    }else{
        m+='0';
    }f(x/y,y);
    printf("%c",m);
    return;
}
int main(){
    int n,m;
    cin>>n>>m;
    cout<<n<<"=";
    f(n,m);
    cout<<"(base"<<m<<")";
    return 0;
} 

 

posted on 2020-02-25 22:23  海木言华  阅读(192)  评论(0)    收藏  举报