遞歸實現進制轉換(C++版)


上次呢,我們留下了一道題,今天我們來一起看一看:

題目鏈接:https://www.cnblogs.com/gaozirong/p/10547434.html

這是我寫的程序,大家可以對照參考一下(C++):

#include<bits/stdc++.h>
using namespace std;
long long n,x,m;
long long f(long long a,long long k)
{
    //快速冪求a^k
    if(k==0)return 1;
    if(k==1)return a%n;
    if(k%2==0)return f((a%n)*(a%n)%n,k/2)%n;
    else return (f((a%n)*(a%n)%n,k/2)*(a%n))%n;
}
int main()
{
    long long k;
    cin>>n>>m>>k>>x;
    cout<<(x%n+((m%n)*(f(10,k)%n)%n))%n;
    return 0;
}

今天我們來講一講進制,首先,進制是什么?

進制也就是進位計數制,是人為定義的帶進位的計數方法(有不帶進位的計數方法,比如原始的結繩計數法,唱票時常用的“正”字計數法,以及類似的tally mark計數)。 對於任何一種進制---X進制,就表示每一位置上的數運算時都是逢X進一位。 十進制是逢十進一,十六進制是逢十六進一,二進制就是逢二進一,以此類推,x進制就是逢x進位。

現在常用的是十進制、二進制、八進制和十六進制,今天我們一起來看一看進制轉換。

如何轉換?

就以十進制轉換成二進制為例:

例如,十進制的115轉換為二進制:(詳見下圖)

十進制轉換成二進制運用的是短除法。如果x進制轉換為y進制,就要先把x轉換為十進制數,然后在用十進制數轉換為y進制數。

參考代碼:

參考代碼分為幾種不同的點,供你們參考:

//二進制轉換成八進制:
#include<bits/stdc++.h>
using namespace std;
string num[]={"0","1","2","3","4","5","6","7"};
string f(string s)
{
    int sum=0,j=1;//j表示的是2的多少次冪 
    if(s.size()<=3)//這是邊界,求出s對應的十進制數
    {
        for(int i=s.size()-1;i>=0;i--)
        {
            sum+=(s[i]-'0')*j;
            j*=2; 
        }
        return num[sum];
    }
    string s1=s.substr(s.size()-3,3);//截取最后三個字符
    string s2=s.substr(0,s.size()-3);//截取前面的部分
    return f(s2)+f(s1); 
}
int main()
{
    string s;
    cin>>s;
    cout<<f(s);
    return 0;
}
//十六進制轉換成二進制:
#include<bits/stdc++.h>
using namespace std;
string num[]={"0000","0001","0010","0011","0100","0101","0110","0111",
             "1000","1001","1010","1011","1100","1101","1110","1111"};
//num[i]表示的是十六進制數i對應的二進制數 
string f(string s)
{
    if(s.size()==1)
    {
        if(s[0]>='0'&&s[0]<='9')//如果是數字,對應的二進制數 
            return num[s[0]-'0'];
        return num[s[0]-'A'+10];//處理字母 
    }
    string s1=s.substr(s.size()-1,1);
    string s2=s.substr(0,s.size()-1);
    return f(s2)+f(s1); 
}
int main()
{
    string s;
    cin>>s;
    string S=f(s);
    while(S[0]=='0')//去除前導0 
        S.erase(0,1);
    cout<<S;
    return 0;
}
//二進制轉換成十六進制:
#include<bits/stdc++.h>
using namespace std;
string num[]={"0","1","2","3","4","5","6","7",
             "8","9","A","B","C","D","E","F"};
string f(string str)
{
    if(str.size()<=4)
    {
        int sum=0,i=1;
        for(int j=str.size()-1;j>=0;j--)
        {
            sum+=(str[j]-'0')*i;
            i*=2;
        }
        return num[sum];
    }
    string s1=str.substr(0,str.size()-4);
    string s2=str.substr(str.size()-4,4);
    return f(s1)+f(s2);
}
int main()
{
    string str;
    cin>>str;
    cout<<f(str);
    return 0;
}
//八進制轉換成二進制:
#include<bits/stdc++.h>
using namespace std;
string num[]={"000","001","010","011","100","101","110","111"}; 
//num[i] 表示的是i對應的的二進制數 
string f(string str)
{
    if(str.size()==1)
        return num[str[0]-'0'];
    string s1=str.substr(0,str.size()-1);
    string s2=str.substr(str.size()-1,1);
    return f(s1)+f(s2);
}
int main()
{
    string str;
    cin>>str;
    string S=f(str);
    while(S[0]=='0')//去除前導0 
        S.erase(0,1);
    cout<<S;
    return 0;
}

今天的進制轉換和上期的快速冪一定要復習哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM