算法 分析—用循环和递归设计程序,任给十进制的正整数,从高位到低位逐位输出各位数字

(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)。回溯的过程中再打印输出。

猜你喜欢

转载自blog.csdn.net/da_ye_zi/article/details/86636378