进制转换
刚刚学习了进制转换,在这里小作总结。
在之前一篇位运算的随笔中讲了二进制,这里我们说k进制和十进制。十进制是逢10进1,二进制是逢2进1,可知k进制是逢k进1。
接着是进制转换问题。
先是十进制转k进制,运用短除法,就是十进制数a在k进制下的当前位置是a%k,然后将a/k运算前一个位置,直到a/k=0,例如:
34%3=1 34/3=11 11%3=2 11/3=3 3%3=0 3/3=1 1%3=1 1/3=0 34在三进制下是1021
代码如下:
while(a){ az[++la]=a%k; a=a/k; }
再是k进制转十进制,就是第n位上的数*k^(n-1)全部加起来,例如:
三进制下的1021 1*3^3+0*3^2+2*3^1+1*3^0=34 三进制下的1021是34
k进制下加减乘除,共有两种方法(以加法为例)。
一是再十进制低精下运算,再转成k进制,上代码。
#include<iostream> using namespace std; int main(){ int a,b; int k; cin>>a>>b>>k; int c=a+b; int ans[110]={0}; int l=0; while(c){ ans[++l]=c%k; c=c/k; } for(int i=l;i>=1;i--){ cout<<ans[i]; } return 0; }
二就是我发现,k进制在存储时都是存在数组里,所以我个人觉得在k进制下高精运算会更加方便,上代码。
#include<iostream> #include<cstring> using namespace std; int main(){ int a,b; int k; cin>>a>>b>>k; int az[110]={0},bz[110]={0}; int la=0,lb=0; while(a){ az[++la]=a%k; a=a/k; } while(b){ bz[++lb]=b%k; b=b/k; } int ans[110]={0}; int l=max(la,lb); for(int i=1;i<=l;i++){ ans[i]=az[i]+bz[i]; } for(int i=1;i<=l;i++){ ans[i+1]+=ans[i]/k; ans[i]=ans[i]%k; } if(ans[l+1]>0){ l++; } for(int i=l;i>=1;i--){ cout<<ans[i]; } return 0; }