<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; }
浙公网安备 33010602011771号