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; }
五、结果实现