递归实现进制转换(C++版)
上次呢,我們留下了一道題,今天我們來一起看一看:
題目鏈接:https://www.cnblogs.com/gaozirong/p/10547434.html
這是我寫的程序,大家可以對(duì)照參考一下(C++):
#include<bits/stdc++.h> using namespace std; long long n,x,m; long long f(long long a,long long k) {//快速冪求a^kif(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; }今天我們來講一講進(jìn)制,首先,進(jìn)制是什么?
進(jìn)制也就是進(jìn)位計(jì)數(shù)制,是人為定義的帶進(jìn)位的計(jì)數(shù)方法(有不帶進(jìn)位的計(jì)數(shù)方法,比如原始的結(jié)繩計(jì)數(shù)法,唱票時(shí)常用的“正”字計(jì)數(shù)法,以及類似的tally mark計(jì)數(shù))。 對(duì)于任何一種進(jìn)制---X進(jìn)制,就表示每一位置上的數(shù)運(yùn)算時(shí)都是逢X進(jìn)一位。 十進(jìn)制是逢十進(jìn)一,十六進(jìn)制是逢十六進(jìn)一,二進(jìn)制就是逢二進(jìn)一,以此類推,x進(jìn)制就是逢x進(jìn)位。
現(xiàn)在常用的是十進(jìn)制、二進(jìn)制、八進(jìn)制和十六進(jìn)制,今天我們一起來看一看進(jìn)制轉(zhuǎn)換。
如何轉(zhuǎn)換?
就以十進(jìn)制轉(zhuǎn)換成二進(jìn)制為例:
例如,十進(jìn)制的115轉(zhuǎn)換為二進(jìn)制:(詳見下圖)
十進(jìn)制轉(zhuǎn)換成二進(jìn)制運(yùn)用的是短除法。如果x進(jìn)制轉(zhuǎn)換為y進(jìn)制,就要先把x轉(zhuǎn)換為十進(jìn)制數(shù),然后在用十進(jìn)制數(shù)轉(zhuǎn)換為y進(jìn)制數(shù)。
參考代碼:
參考代碼分為幾種不同的點(diǎn),供你們參考:
//二進(jìn)制轉(zhuǎn)換成八進(jìn)制: #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對(duì)應(yīng)的十進(jìn)制數(shù) {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);//截取最后三個(gè)字符string s2=s.substr(0,s.size()-3);//截取前面的部分return f(s2)+f(s1); } int main() {string s;cin>>s;cout<<f(s);return 0; } //十六進(jìn)制轉(zhuǎn)換成二進(jìn)制: #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]表示的是十六進(jìn)制數(shù)i對(duì)應(yīng)的二進(jìn)制數(shù) string f(string s) {if(s.size()==1){if(s[0]>='0'&&s[0]<='9')//如果是數(shù)字,對(duì)應(yīng)的二進(jìn)制數(shù) 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')//去除前導(dǎo)0 S.erase(0,1);cout<<S;return 0; } //二進(jìn)制轉(zhuǎn)換成十六進(jìn)制: #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; } //八進(jìn)制轉(zhuǎn)換成二進(jìn)制: #include<bits/stdc++.h> using namespace std; string num[]={"000","001","010","011","100","101","110","111"}; //num[i] 表示的是i對(duì)應(yīng)的的二進(jìn)制數(shù) 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')//去除前導(dǎo)0 S.erase(0,1);cout<<S;return 0; }今天的進(jìn)制轉(zhuǎn)換和上期的快速冪一定要復(fù)習(xí)哦!
轉(zhuǎn)載于:https://www.cnblogs.com/gaozirong/p/10548843.html
總結(jié)
以上是生活随笔為你收集整理的递归实现进制转换(C++版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。