一. 题目说明
题目1:将非负十进制整数n转换成b进制。(其中b=2~16)
二. 算法设计思路
- 递归算法
递归体:
transform(int n,int d){
输出转换结果 n=0;
transform(n/d,d)
n>=0
}
2.非递归算法
直接用Windows特有的
char *itoa( int value, char *string,int radix)函数来实现进制的转换。
有关函数说明:
/value:欲转换的数据;string:目标字符串的地址;radix:转换后的进制数,可以是10进制、16进制等。*/
三、代码实现
1.用递归方法实现
#include<iostream>
using namespace std;
void transform(int n,int d)
{
if(n==0)
{
return
;
}
else
{
transform(n/d,d);
if(n%d>=10)
{
printf("%c",n%d+55);
}
else
{
printf("%d",n%d);
}
}
}
int main()
{
int
n,d,i;
do{
cout<<"输入一个十进制数:";
cin>>n;
cout<<"输入要转换的进制数:";
cin>>d;
cout<<"转换结果为:";
transform(n,d);
cout<<endl;
cout<<"还想继续吗?(1.yes,2.no)";
cin>>i;
}while(i==1);
return
0;
}
2、用非递归实现<1>
#include<iostream>
using namespace std;
void transform(int n,int s)//数制转换函数,n十进制数,要转换成s进制数
{
int m,i=0,a[32];
while(n!=0)
{
a[i++]=n%s;
n=n/s;
}
while(i>0)
{
m=a[--i];
if(m<10)
cout<<m;
else
printf("%c",m+87);
}
cout<<endl;
}
int main()
{
int
number,d,i;
do{
cout<<"输入一个十进制数:";
cin>>number;
cout<<"输入要转换的进制数:";
cin>>d;
cout<<"转换结果为:";
transform(number,d);
cout<<"Do
you want to continue(1.yes,2.no)";
cin>>i;
}while(i==1);
return
0;
}
用非递归实现<2>
#include<iostream>
using namespace std;
int main(){
int N,S,i;
char a[80];
do{
cout<<"输入一个十进制数:";
cin>>N;
cout<<"输入要转换的进制数:";
cin>>S;
cout<<"转换结果为:";
cout<<itoa(N,a,S)<<endl;
cout<<"还想继续吗?(1.yes,2.no)";
cin>>i;
}while(i==1);
return 0;
}
四、总结
这次作业只完成了基本要求,提高要求不能输出正确的结果,还在完善的过程中。将十进制转换成任意进制用了递归和非递归两种方法实现,提高对递归方法的理解,递归最难的地方就是找到正确的递归体,所以首先要分析题目,找到递归体及递归结束条件。在非递归的方法中使用了char *itoa( int
value, char *string,int radix)函数,比较方便。还实现了不用上述函数实现十进制到任意进制的转换。