题目1:将非负十进制整数n转换成b进制。(其中b=2~16)
一:算法思路
整体思路:将十进制转换成b进制,就是除以进制数取余数的倒序。
递归方法:
主要是先找到递归出口,这个题目拥有两个出口,因为当进制大于等于10的情况下,余数有可能也大于等于10,但10以上的表示是A-F,所以出口有两种
递归函数ff(int n,int m) ;ff(n/m,m);
通过调用递归函数逐步输出余数。
非递归方法:
也是求余数,思路差不多,余数有两种情况当余数小于十,0—9表示大于等于十A—F表示,所以用if语句来判断余数是那种情况
if((num%w)<10)
a[i]=(num%w)+'0';
else
a[i]='A'+((num%w)-10);。
数组倒序输出为
for(int j=i-1;j>=0;j--)
cout<<a[j];
代码实现
递归方法
#include<iostream>
#include<stdlib.h>
using namespace std;
void ff(int n,int m)
{
if(n<m&&n<10)
{
cout<< n;
}
else if(n<m&&n>=10)
{
cout<<char('A'+((n%m)-10));
}
else
{
ff(n/m,m);
if (n%m<10)
{ cout<<n%m;
}
else
{ cout<<char('A'+((n%m)-10));
}
}
}
void main()
{
int n;
int m;
cout<<"请输入一个十进制数:"<<" ";
cin>>n;
cout<<"请输入想要转换的进制:"<<" ";
cin>>m;
ff(n,m);
}
非递归方法
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
char a[100];
int num=0;
int w=0;
int i=0;
cout<<"请输入一个十进制数"<<endl;
cin>>num;
cout<<"输入要转换的数"<<endl;
cin>>w;
if(!num)
{
cout<<0<<endl;
return 0;
}
while(num)
{
if((num%w)<10)
a[i]=(num%w)+'0';
else
a[i]='A'+((num%w)-10);
i++;
num=num/w;
}
for(int j=i-1;j>=0;j--)
cout<<a[j];
return 0;
}
总结:
本次题目主要是进制的转换,大致方向就是将数值除以进制在取余数的倒序,有个地方需要注意,就是十进制以上余数会出现大于10的情况,但表示的时候只能0-9,十以上用A-F表示。两个递归出口,这道题时任意进制,但我们可以先从2进制分析,思路方法都差不多,找到共同点,在写任意进制,在写递归时遇到很多问题,把每一步都理解清楚,然后自己在去写,写的过程也出现好多问题,在运行时,输入后没有结果输出,明明思路都没问题,结果因为疏忽,主函数那里没有调用,通过调试找到问题所在。我们要在每一次错误中积累经验。