将非负十进制整数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(函数体)

二.递归栈

                   

三.程序源码

#include<stdio.h>

#include<Windows.h>

#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;

}

四.调试,运行结果

运行结果:

五.经验归纳

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值