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

上次呢,咱們留下了一道題,今天咱們來一塊兒看一看:

題目連接:https://www.cnblogs.com/gaozirong/p/10547434.htmlhtml

這是我寫的程序,你們能夠對照參考一下(C++):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進位。spa

如今經常使用的是十進制、二進制、八進制和十六進制,今天咱們一塊兒來看一看進制轉換。code

如何轉換?

就以十進制轉換成二進制爲例:htm

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

十進制轉換成二進制運用的是短除法。若是x進制轉換爲y進制,就要先把x轉換爲十進制數,而後在用十進制數轉換爲y進制數。ci

參考代碼:

參考代碼分爲幾種不一樣的點,供大家參考:get

//二進制轉換成八進制:
#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; }

今天的進制轉換和上期的快速冪必定要複習哦!string

相關文章
相關標籤/搜索