将非负十进制整数n转换成b进制。(其中b=2~16)

一.题目分析:题目1:将非负十进制整数n转换成b进制。(其中b=2~16)

将非负十进制整数转换成任意进制,用十进制除以进制数b,并求余 使用递归求解,非递归求解将余数逆向输出。       

递归模型:f(n,b)= 0        n<0(递归出口)

                    f(n,b)=n/b ,n%b  n>0(函数体)

二.递归栈

将非负十进制整数n转换成b进制。(其中b=2~16)_第1张图片

                   

三.程序源码

#include

#include

#pragma warning (disable:4996)

//递归

int change1(int n, int b)

{

    if (n == 0)

         return;

    else

    {

         change1(n / b,b);

         if (b >= 10)//十进制以上

         {

             if (n%b >= 10)

             {

                  printf("%c", (char)(n%b - 10) + 'A');

             }

             else

                  printf("%d", n%b);

         }

         //进制小于十

         else

             printf("%d", n%b);

    }

}

//非递归

int change2(char *p,int n,int b)

{  

    int r = 0;

    while (n > 0)

         {

             r = n % b;//求余

             if (r < 10)

                  *p = r + 48;//小于10的数转换成字符后赋给p所指向的元素

             else

             {

                  *p = r + 55;//大于10的转化为A~F后赋给p所指向的元素

             }

             n = n / b;

             p++;//指针后移

         }

         return 0;

}

int main()

{

    int n=0;

    int b = 0;

    char a[33] = { 0 };//存放结果的数组

    int len = sizeof(a) / sizeof(a[0]);

    printf("请输入一个非负整数:");

    scanf("%d", &n);

    printf("请输入要转换成几进制:");

    scanf("%d", &b);

    change1(n, b);

    change2(a,n, b);

    for (int i = len - 1; i >= 0; i--)//逆向输出

    {

         printf("%c", a[i]);

    }

    system("pause");

    printf("\n");

    return 0;

}

四.调试,运行结果

将非负十进制整数n转换成b进制。(其中b=2~16)_第2张图片

将非负十进制整数n转换成b进制。(其中b=2~16)_第3张图片

运行结果:

将非负十进制整数n转换成b进制。(其中b=2~16)_第4张图片

五.经验归纳

通过此次对递归问题的练习,更进一步强化了对递归问题的认识和理解,递归问题主要是找到递归出口,找出递归关系,在此次编写程序中还有在对二进制转换为任意进制时,进制数大于10时,要将其转换为字符输出,由于递归与栈“后进先出”的特点保持一致,和进制转换时余数自下向上输出规律相符,当使用非递归方法时,就得将结果反向输出。相对来说递归的代码更简洁,递归转换为非递归可以用迭代方法,使用栈结构和递归树更能清晰的表达出递归的特点。

你可能感兴趣的:(将非负十进制整数n转换成b进制。(其中b=2~16))