4.16趣味百题第十题

发布时间 2023-04-16 21:13:23作者: 混沌武士丞

一 问题描述

输入一个M进制的数x,实现对x向任意的一个非M进制的数的转换。

二 设计思路

利用进制转化的基数与权进行转化。可以先把当前数转化为十进制,接着转化为为别的进制。

利用数字与字符的转化实现不同进制的数字存储。

三 流程图

四 代码实现(c++)

#include<iostream>
using namespace std;
#define Max 101 //限定数组最大长度
int char_to_num(char ch); //返回字符对应的数字
char num_to_char(int num); //返回数字对应的字符
long source_to_decimal(char temp[],int source);
//返回由原数转换成的十进制数
int decimal_to_object(char temp[],long decimal_num,int object);
//返回转换成目标进制的数组长度
void output(char temp[],int length); //将字符数组逆序输出
int main(){
int source; //存储原来的进制
int object; //存储目标进制
int length; //存储转化后的数组长度
long decimal_num; //存储转换成的十进制数
char temp[Max]; //存储待转化的数值 和转化后的数值
int flag=1; //是否结束程序
while(flag)
{
cout<<"转换前的数是:";
cin>>temp;
cout<<"转换前的进制是:";
cin>>source;
cout<<"转换后的进制是";
cin>>object;
cout<<"转换后的数值是:";
decimal_num=source_to_decimal(temp,source);
length=decimal_to_object(temp,decimal_num,object);
output(temp,length);
cout<<"继续请输入1,否则输入0";
cin>>flag;
}
}
int char_to_num(char ch)
{
if(ch>='0'&&ch<='9')
return ch-'0'; //0~9
else
return ch-'A'+10;//大于10的数字
}
char num_to_char(int num)
{
if(num>=0&&num<=9)
return (char)('0'+num-0);
else
return (char)('A'+num-10);
}
long source_to_decimal(char temp[],int source)
{
long decimal_num=0;
int length;
int i;
for(i=0;temp[i]!='\0';i++);
length=i;
for(i=0;i<length-1;i++)
decimal_num=(decimal_num*source)+char_to_num(temp[i]);
return decimal_num;
}
int decimal_to_object(char temp[],long decimal_num,int object)
{
int i=0;
while(decimal_num)
{
temp[i]=num_to_char(decimal_num%object);
decimal_num=decimal_num/object;
i++;
}
temp[i]='\0';
return i;
}
void output(char temp[],int length)
{
int i;
for(i=length-1;i>=0;i--)
cout<<temp[i];
cout<<endl;
}