递归实现进制转换(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;
}

今天的进制转换和上期的快速幂一定要复习哦!

posted @ 2019-03-17 20:59  高梓荣  阅读(3933)  评论(0编辑  收藏  举报