(1)循环算法设计:
对于任意给出的十进制数,它的位数是未知的,因此在算法中采用“从低位到高位”输出各位数字,把输出的结果保存在数组中,等计算完成之后,在把输组倒叙输出,就能得到这个十进制数的“从高位到低位”输出的结果。
在算法的设计中用到了“从低位到高位”输出这个十进制数,而“从低位到高位”输出的主要思路如下所示:
<1> 先用该数字n mod 10求出余数,得到n的个位数字的值,即n%10;
<2> 为了保证循环体不做改变,通过n=n/10,把原本的n的十位数变为个位数,因此求十位数的算式仍为n mod 10。
程序设计如下所示:
#include <stdio.h>
void main()
{
int i=0;
int n,j,a[16]; //n表示输入的十进制数
printf("请输入十进制数:");
scanf("%d",&n);
while(n>=10)
{
a[i]=n%10;
i++;
n=n/10;
}
a[i]=n;
for(j=i;j>=0;j--)
printf("%d\t",a[j]);
printf("\n");
}
程序的运行结果如下图所示:
循环体的条件是输出的十进制数要大于10,因此当输入的十进制数小于10的时候,不执行循环,直接打印输出这个小于n的十进制数即可,如图所示:
(2)递归算法设计:
递归算法是先递归的求出输入的十进制数n/10的个位数字,然后再求个位数字n的个位数字并输出,输出操作是在回溯的时候完成的。当n小于10的时候,n为一位数字停止递归直接打印输出即可。
程序代码如下所示:
#include <stdio.h>
f(int n)
{
if(n<10)
printf("%d\t",n);
else
{
f(n/10); //调用自身
printf("%d\t",n%10);
}
}
void main()
{
int n; //n表示输入的十进制数
printf("请输入十进制数:");
scanf("%d",&n);
f(n);
printf("\n");
}
程序运行结果如图所示:
当输入的十进制数大于10时:
当输入的十进制数小于10时:
对这个问题来说,循环算法和递归算法的空间效率是相等的,但是时间效率并不相等,虽然他们的时间效率有差别,但是递归算法较循环算法而言相对来就说比较简单,并且可读性也比循环算法的可读性较好。
循环算法的设计重点是在于构造“不变式”的循环体,递归算法的过程是直接或者间接调用自身的一个过程。相比于循环算法,感觉递归算法不是很好理解,但是递归算法的可读性要比循环算法高。
递归算法在运行的过程中不断的调用自身,在实验中,以251为例,递归算法的执行过程为:f(251)->f(25)->f(1),递归完成后进行回溯,即:f(1)-> f(25)-> f(251)。回溯的过程中再打印输出。