递归实现进制转换(C++版)
生活随笔
收集整理的這篇文章主要介紹了
递归实现进制转换(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^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; }今天我們來講一講進制,首先,進制是什么?
進制也就是進位計數制,是人為定義的帶進位的計數方法(有不帶進位的計數方法,比如原始的結繩計數法,唱票時常用的“正”字計數法,以及類似的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; }今天的進制轉換和上期的快速冪一定要復習哦!
轉載于:https://www.cnblogs.com/gaozirong/p/10548843.html
總結
以上是生活随笔為你收集整理的递归实现进制转换(C++版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yii2关联表
- 下一篇: sizeof 数组_简单的一维数组竟然有