题目描述
将非负十进制整数n转换成b进制。(其中b=2~16)
算法分析
记住这个方法:对于进制转换类问题,就是不断的余b模b。(b代表进制数的基数)
具体步骤:重复执行①和步骤②,直到n为0结束。
①取b进制数的个位:求余运算n%b,把结果存入数组。
②将10进制数降一阶:整除运算n=n/b。
③逆序输出数组元素。如果数组元素小于10,照原样输出;如果数组元素大于等于10,输出其相应的符号,例如,10输出A,11输出B......
(原文:https://blog.csdn.net/John_Wang7/article/details/62244114)
eg:将13转换为2进制的过程如下:
n = 13,b = 2
->>13 % 2 = 1
->>13 / 2 = 6
->> 6 % 2 = 0
->> 6 / 2 = 3
->> 3 % 2 = 1
->>3 / 2 = 1
->> 1 % 2 = 1
->> 1 / 2 = 0
输出:1101
递归模型
程序实现
①递归
void Convert(int i,int b)
{
if(i==0)//递归出口
{
return;
}
a[cnt++]=i%b;
Convert(i/b,b);
}
②非递归
非递归就是利用while循环。
//非递归
void Convert(int i,int b)
{
while(i)
{
a[cnt++] = i % b;
i = i / b;
}
}
运行结果
附:程序源码
#include<stdio.h>
#include<iostream>
#include<String.h>
using namespace std;
int cnt=0;
int flag = 1;
char a[255];
//递归
/*
void Convert(int i,int b)
{
if(i==0)//递归出口
{
return;
}
a[cnt++]=i%b;
Convert(i/b,b);
}
*/
//非递归
void Convert(int i,int b)
{
while(i)
{
a[cnt++] = i % b;
i = i / b;
}
}
int Print(int &num)
{
for(int i=cnt-1;i>-1;i--)
{
if(a[i]<10)
{
printf("%d",a[i]);
}
else
{
printf("%c",a[i]+'A'-10);
}
}
printf("\n");
printf("继续吗?(1(Y)/0(N)");
num = 0;
scanf("%d",&flag);
return flag;
}
int main()
{
while(flag)
{
int integer,base;
printf("输入一个大于0的任意正整数:");
scanf("%d",&integer);
printf("输入进制数的基数:(2~16)");
scanf("%d",&base);
if( base>16 || base<2 )
{
printf("输入错误!请输入2~16以内的进制数基数:");
scanf("%d",&base);
}
Convert(integer,base);
flag = Print(cnt);
}
return 0;
}