二进制,十进制,十六进制基数都是正的.
实际上每种进制上的数都是不断除以基数所得的余数;
正如 123,转化成二进制
从最低位开始:
123%2=1 最后一位是 1
123=1+ 61*2
61%2=1 则倒数第二位是1
61=1+30*2
30%2=0则倒数第三位是0
30=15*2
15%2=1则倒数第四位是1
15=1+7*2
7.。。。。1
3.。。。。1
1.。。。。1
0结束
则123==1111011似乎进制转化就是这样转化 的,但是当时没有仔细考虑
当基数是负数时:余数存在是负数的情况
例如:-20 转化成-3进制 -20= -2+(-3)* 6;
余数是-2 ;将余数转化成正数可以将商加一即可
-20=(-2) +(-3)*7-(-3)=1+(-3)*7;如此分治求负进制
通过数组实现:
#include<iostream> using namespace std; int a[1000]; int main () { int n,m; cin>>m>>n; cout<<m<<'='; int i; for( i=0;;i++) { int rps=m%n; if(rps<0)rps-=n,m+=n; a[i]=rps; m/=n; if(m==0)break; } for(int j=i;j>=0;j--) { if(a[j]>=10) printf("%c", 'A'+a[j]-10); else cout<<a[j]; } cout<<"(base"<<n<<")"<<endl; return 0; }
通过递归实现
//通过递归时,由于时从低位向高位进行求解,所以先 递归到最大位再进行输出
#include<iostream> #include<cstdio> using namespace std; void p(int m,int n) { if(m==0)return; int rps=m%n; if(rps<0)rps-=n,m+=n; p(m/n,n); if(rps>=10) printf("%c",'A'+rps-10); else cout<<rps; } int main () { int num,n; cin>>num>>n; cout<<num<<'='; p(num,n); cout<<"(base"<<n<<')'; return 0; }