1. 程式人生 > >C++遞迴實現十進位制轉二進位制、八進位制、十六進位制

C++遞迴實現十進位制轉二進位制、八進位制、十六進位制

1.轉二進位制與八進位制分析

我們最熟悉不過的就是短除法將十進位制轉二進位制,將餘數倒著輸出便是該是十進位制的二進位制數,那麼很容易想到拿十進位制數n%2(或者8)這樣可以得到最高位的二進位制(八進位制)數,然後將n/=2(8)繼續取餘,這樣就可以得到下一位,我這裡使用字元陣列儲存,因為2進位制只有0-1兩個字元,八進位制則是0-7 8個字元。

2.實現二進位制轉換程式碼:

#include<iostream>
#include<cstring>
using namespace std;

int i = 0;

void turn(int n,int *c)
{
    if(n == 0) return;
    else
    {
        c[i]=n%2;
        i++;
        turn(n/2,c);
    }
}

int main()
{
    int n;
    cin>>n;
    int cc[10000];
    if(n == 0)
    {
        cout<<'0';
    }
    turn(n,cc);
    for(int j = i-1;j>=0;j--)
    cout<<cc[j];

    return 0;
}

3.實現十進位制轉八進位制程式碼:

#include<iostream>
#include<cstring>
using namespace std;

int i = 0;

void turn(int n,int *c)
{
    if(n == 0) return;
    else
    {
        c[i]=n%8;
        i++;
        turn(n/8,c);
    }
}

int main()
{
    int n;
    cin>>n;
    int cc[10000];
    if(n == 0)
    {
        cout<<'0';
    }
    turn(n,cc);
    for(int j = i-1;j>=0;j--)
    cout<<cc[j];

    return 0;
}

4.十進位制轉十六進位制分析:

因為十六進位制從10以後依次為’A’,’B’,’C’,’D’,’E’,’F’. 在這裡不適合用字元去處理,因為ASCALL值的字元不會存’10’,我們採用字串進行操作。我們判斷n%16的餘數是否大於等於10然後在字串末尾加上(‘A’+(n%16)-10)即可。

5.十進位制轉十六進位制程式碼:

#include<iostream>
#include<cstring>
using namespace std;

int i = 0;
string str;

void turn(int n)
{
    if(n == 0) return ;
    else
    {
        int j = (n%16);
        if(j == 0)
        str+="0";
        if(j>0&&j<10)
        str+=(j+'0');
        if(j>=10)
        {
            str += ('A'+(j-10));
        }
        turn(n/16);
    }
}

int main()
{
    int n;
    cin>>n;
    if(n == 0)
    {
        cout<<'0';
    }
    turn(n);
    for(int j = str.length()-1;j>=0;j--)
    cout<<str[j];

    return 0;
}