进制转换

刚刚学习了进制转换,在这里小作总结。

在之前一篇位运算的随笔中讲了二进制,这里我们说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;
} 

 

posted @ 2022-01-25 15:38  zzzzzz2  阅读(257)  评论(0编辑  收藏  举报