【解题思路】
递归与倒序计算(以二进制为例)
在二进制中,奇数的末尾一定是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);}
}