1.题目分析
题目要求将非负十进制数转化成b进制,分析此题目主要有以下几点
(1)转化的思路为转化为几进制数就用原来的十进制数除以要转换的进制数求余数。
(2)如果是十进制以上就涉及到最后表示的时候要用字符代替数字,实现方式可以这样
if (n%d >= 10)
{
printf("%c", (char)((n%d - 10) + ‘A’));
}
(3)如果余数小于10,就直接输出。
实现递归函数出口为:
if (n%d >= 10)
{
printf("%c", (char)((n%d - 10) + ‘A’));
}
else//如果余数小于10,则直接输出
printf("%d", n%d);
实现递归函数结构体为:
void decimalToAny(int n, int d)//10进制转换成任意进制
{
if (n == 0)
return;
else
{
decimalToAny(n / d, d);
if (d >= 10)//如果是10进制以上
{
if (n%d >= 10)
{
printf("%c", (char)((n%d - 10) + ‘A’));
}
else//如果余数小于10,则直接输出
printf("%d", n%d);
}
//如果进制小于10,不会有字母的问题
else
printf("%d", n%d);
}
}
2.画出递归树或者递归栈的调用过程。
例:将13转化成4进制
递归法源代码
#include<stdio.h>
void decimalToAny(int n, int d)//10进制转换成任意进制
{
if (n == 0)
return;
else
{
decimalToAny(n / d, d);
if (d >= 10)//如果是10进制以上
{
if (n%d >= 10)
{
printf("%c", (char)((n%d - 10) + 'A'));
}
else//如果余数小于10,则直接输出
printf("%d", n%d);
}
//如果进制小于10,不会有字母的问题
else
printf("%d", n%d);
}
}
int main()
{
int n, d;
char again = 'y';
while (again == 'y' || again == 'Y')
{
printf("请输入十进制数:");
scanf("%d", &n);
printf("请输入要转换成几进制:");
scanf("%d", &d);
if (n == 0)
{
printf("转换完成:0");
continue;
}
printf("转换完成:");
decimalToAny(n, d);
printf("\n");
printf("---------继续[y/n]?:");
scanf("%s", &again);
}
return 0;
}
3.实现非递归方法。
#include<stdio.h>
#include<string.h>
int main()
{
int n,r,i;
while(scanf("%d %d",&n,&r)!=EOF)
{
if(n<0)
{
printf("-");n=-n;
}
if(n==0){printf("0\n");continue;}
int c=0,a[100];
while(n)
{
a[c]=(n%r);
c++;
n/=r;
}
for(i=c-1;i>=0;i--)
{
if(a[i]>=10)
{
printf("%c",'A'+a[i]-10);
}
else printf("%d",a[i]);
}
printf("\n");
}
}
4.运行结果及调试展示
非递归运行展示:
5.总结归纳
在本次实验中,最大的收获就是了解到了递归函数的执行过程,借助了堆栈的概念,明白递归的执行过程其实和栈的概念差不多,递归是后调用的先返回,栈是后进先出,我们可以借助堆栈图,对递归的理解更加具体化。不过在实际运用中递归方法还是很巧妙的,方便于理解但是不容易想到,所以平时应该将递归与非递归方法结合,更好的完成题目。
通过对非递归方法的实践对堆栈有了更深的理解,从字面意思理解使用堆栈思想感觉自己能懂,但实际运用的时候就又是另一回事了,在学数据结构时觉得这些算法很实用,但也没真正实践过,今天需要进制转换时,就是使用堆栈的一个很好的例子,在实践的过程中深深的体会到了多动手练代码的重要性,要不然就只能想的来,写不出来。