设计一个程序,该程序能将任意的一个int型10进制非负整数转换成任意N进制的数(N<=16)

2025-04-08 09:32:54
推荐回答(1个)
回答1:

//程序供参考
#include 
#include 

//函数:reverse
//功能:反转字符串
//参数:  
//    str : 要进行反转的字符串
//返回值:无
void revease( char * str)
{
char * head = str;                     //指向字符串的头部第一个字符
char * tail = str + strlen( str ) - 1; //指向字符串的尾部最后一个字符
char   tmp;                            //交换头尾字符时的临时变量
while( head < tail)                    //只要头部指针比尾部指针小
{
//交换头部指针和尾部指针字符
tmp = * head; 
*head = *tail;
*tail=tmp;
//
head ++;   //头部指针后移
tail--;    //尾部指针前移
}
};

//函数:convert
//功能:将十进制数转成任意进制,并将结果通过通过参数返回
//参数:  
//    num:要转换的数字
//   base:进制
//    out:输出缓冲区,以字符串的形式返回转换后的数字
//返回值:true 成功,false 失败
bool convert( unsigned long num, unsigned long base,char * out)
{
char ch[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; //定义数码
char * p = out;        //指向输出缓冲区的头部
unsigned long remain;  //转换时用的变量,保存 余数

//如果进制超范围,返回false
if(base > 16 || 1 == base )
return false;

//数字除以基数,取余;结果除基数再取余,直到结果整数部分为0止
//把得到的余数倒转 即得到 对应的相应进制的数字
do
{
remain = num % base; //取一次相除的余数
num = num / base;    //取一次相除的结果
*p = ch[remain];     //将余数对应的表示字符写到缓冲区
p++;                 //缓冲区后移
}while( num > 0);        //直到结果整数部分为0止

*p = '\0';               //给输出缓冲的最后加个结束字符

revease( out );          //把输出缓冲区倒转
return true;
};

int main()
{
int  i;             //循环变量 
int  N;             //个数
unsigned long num;  //要转换的数
unsigned long base; //要转换成的进制

char outbuff[65];   //输出缓冲区,64位系统,long 最多64位,加一位放结束字符

printf("请输入要转换的十进制数个数 : ");
scanf("%ld",&N);

for(i = 1; i<= N;i++)
{
printf("第%3d个数及进制 : ",i);
scanf("%ld %ld",&num,&base);
if( convert( num,base,outbuff))
{
printf("     要转换的数 : %ld\r\n",num);
printf("     转换成%02ld数 : %s\r\n",base,outbuff);
}
else
printf("转换失败。\r\n");
}

getchar();
getchar();
}