c++打卡第十四天

前面我们写过一个n进制数如何转化为十进制数,那个博客中只针对小于或等于十进制的数转化,对于大于10的进制转换,我们并没有介绍,今天我们同时来实现n进制转化为十进制以及十进制转化为n进制。

一、问题描述。

 二、设计思路

①、由于涉及到大于十的进制数,所以我们这次输入字符,那么当n进制转化为十进制时,我们可以先将字符每一位转化为数字,例'A‘=s-'A'+10,在十六进制中,字符A对应的数字就是10,然后这次我们在对权重进行幂运算时,不再使用函数,而是对于初始值每次乘以基数,那么对于一个n长度的x进制数,到了最后,字符串的第一位数字乘以了n-1次基数,以此类推,最后一位乘以的权重为1。

②、对于十进制转化为n进制我们采取求余法,对于每次求出的余数保存在一个数组中,同时更新输入的数除以n后的数,到了最后计入数组长度,并且逆序输出即可。

三、流程图

 四、代码实现。

#include<iostream>
using namespace std;
#define N 101
char temp[N];
int zzs(char s)//将传入的字符转化为数字 
{
    if(s>='0'&&s<='9')
    {
        return s-'0';
    }
    else 
    {
        return s-'A'+10;
    }
 } 
 char szz(int num)//将传入的数字转化为字符 
 {
    if(num>=0&&num<=9)
    {
        return (char)('0'+num-0);
    }
    else
    {
        return (char)('A'+num-10);
    }
 }
long nzs(char temp[],int jc) //某值转化为十进制 
{
    int len=0;
    int i;
    long mbz=0;//十进制数 
    for(i=0;temp[i]!='\0';i++);//遍历数组的长度 
        len=i;
     for(i=0;i<len;i++)
     {
         mbz=(mbz*jc)+zzs(temp[i]);//对于每位数进行加权重计算 
     }
     return mbz;
}
int  szn(char temp[],long mbz,int ob)//十进制数转化为最终目标进制
{
    int i=0;
    while(mbz)
    {
        temp[i]=szz(mbz%ob);//对十进制数进行求余,并将余数记录数组中 
        mbz=mbz/ob;//更新十进制数 
        i++;
     } 
     temp[i]='\0';//目标进制数末尾加终止符 
     return i;
 } 
 void printf(char temp[],int length)
 {
     int i=0; 
     for(i=length-1;i>=0;i--)
     {
         cout<<temp[i];
     }
     cout<<endl;
 }
int main()
{
    int jc;//当前进制 
    int ob;//目标进制 
    int flag=1;
    long obn;//转换成的十进制数 
    int length;//数字长度 
    while(flag)//可进行多次循环,直到测试结束 
    {
    cout<<"输入要转换的数"<<endl;
    cin>>temp;
    cout<<"输入次数当前的进制"<<endl;
    cin>>jc;
    cout<<"输入要转换的进制"<<endl;
    cin>>ob;
    obn=nzs(temp,jc);//将某值转化为十进制 
    length=szn(temp,obn,ob);//将这个十进制数转化为n进制数 
    printf(temp,length);
    cout<<"要继续测试吗,如果是输入1,否则输入0"<<endl;
    cin>>flag; 
    }
    return 0;
 } 

 

五、结果实现

 

posted @ 2023-04-24 20:30  七安。  阅读(14)  评论(0编辑  收藏  举报