用递归函数以二进制、八进制、十六进制形式打印整数

【解题思路】
递归与倒序计算(以二进制为例)
在二进制中,奇数的末尾一定是1,偶数的末尾一定是0,所以通过5%2即可确定5的二进制数的最后一位是1还是0。一般而言,对于数字n,其二进制的最后一位是n%2.因此,计算的第一位数字实际上是待输出二进制数的最后一位。这一规律提示我们,在递归函数的递归调用之前计算n%2,在递归调用之后打印结果。这样,计算的第一个值正好是最后一个打印的值。
要获得下一位数字,必须把原数除以2。这种计算方法相当于在十进制下把小数点左移一位,如果计算结果是偶数,那么二进制的下一位就是0;如果是奇数,就是1。那么什么时候停止计算?当与2相除的结果小于2时停止计算,因为只要结果大于或等于2,就说明还有二进制位,每次除以2就相当于去掉一位二进制,直到计算出最后一位为止。

【示例代码】(C)
二进制

#include <stdio.h>
void to_binary(unsigned long n);
int main(void)
{
    unsigned long number;
    printf("Enter an integer (q to quit):");
    while(scanf("%lu",&number)==1)
    {
        printf("Binary equivalent: ");
        to_binary(number);
        putchar('\n');
        printf("Enter an integer (q to quit):");
    }
    printf("Does.\n");
    return 0;
}
void to_binary(unsigned long n)
{
    int r;
    r=n%2;
    if(n>=2) {to_binary(n/2);}
    putchar(r==0?'0':'1');
}

八进制(只需在递归函数上稍作修改)

void to_oct(unsigned long n)
{
    int r;
    r=n%8;
    if(n>=8) {to_oct(n/8);}
    putchar(r==0?'0':r+48);//注意putchar()函数输出的是字符,需记忆相应字符的ascii码
}

十六进制(同上,但需注意输出方式)

void to_hex(unsigned long n)
{
    int r;
    r=n%16;
    if(n>=16) {to_hex(n/16);}
    if(r==0) {putchar('0');}
    else if(r<10) {putchar(r+48);}
    else {putchar(r+87);}
}

【C++版】

#include<iostream>
#include <stdio.h>
using namespace std;
void to_binary(unsigned long n);
void to_oct(unsigned long n);
void to_hex(unsigned long n);
int main()
{
    unsigned long number;
    cout<<"Enter an integer (0 to quit):";
    while(cin>>number)
    {
        if(number==0) {break;}
        cout<<"Binary equivalent:";
        to_binary(number);
        cout<<endl;
        cout<<"Oct equivalent:";
        to_oct(number);
        cout<<endl;
        cout<<"Hex equivalent:";
        to_hex(number);
        cout<<endl;
        cout<<"Enter an integer (0 to quit):";
    }
    cout<<"Does."<<endl;
    return 0;
}
void to_binary(unsigned long n)
{
    int r;
    r=n%2;
    if(n>=2) {to_binary(n/2);}
    putchar(r==0?'0':'1');
}
void to_oct(unsigned long n)
{
    int r;
    r=n%8;
    if(n>=8) {to_oct(n/8);}
    putchar(r==0?'0':r+48);
}
void to_hex(unsigned long n)
{
    int r;
    r=n%16;
    if(n>=16) {to_hex(n/16);}
    if(r==0) {putchar('0');}
    else if(r<10) {putchar(r+48);}
    else {putchar(r+87);}
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LG.田猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值