/*
题目:数制转换
内容:给定一个M进制的数x,实现对x向任意的一个非M进制的转换。
作答者:小白杨
收获: 1、刚开始以为这是一个失败的程序转换,不知为什么,数组没有传到被调用函数中,后来经反复折腾,才发现被调用函数中for语句括号后多加了一个‘;’,浪费了大量时间进行调试。
2、这个代码着实垃圾,也不能实现负数的转换和小数点的转换,可优化的地方还有很多。
3、解决字符串有效字符个数的常用方法:for(i=0;temp[i] != '\0';i++)。
4、还有一种思路:将数制转换为十进制,以十进制为轴,进行转换。
*/
#include<stdio.h>
/*
volatile int N,n;
volatile int firstNumber[101],lastNumber[101];
//二进制转八进制
void two_to_eight(int firstNumber[])
{
int i,j;
int lastNumber[101] = {0};
n = N/3+1;
for(i=N-1,j=n-1;i>0&&j>=0;i-=3,j-=1)
{
lastNumber[j] = firstNumber[i]+firstNumber[i-1]*2+firstNumber[i-2]*4;
}
if(i == -1)
lastNumber[0] = firstNumber[2] + firstNumber[1]*2 + firstNumber[0]*3;
else if(i == -2)
lastNumber[0] = firstNumber[1] + firstNumber[0]*2;
else if(i == 0)
lastNumber[0] = firstNumber[0];
printf("转换后的数为:\n");
for(i=0;i<n;i++)
printf("%d",lastNumber[i]);
printf("\n");
}
//二进制转十进制
void two_to_ten(int firstNumber[])
{
}
//二进制转十六进制
void two_to_sixteen(int firstNumber[])
{
}
//八进制转二进制
void eight_to_two(int firstNumber[])
{
}
//八进制转十进制
void eight_to_ten(int firstNumber[])
{
}
//八进制转十六进制
void eight_to_sixteen(int firstNumber[])
{
}
//十进制转二进制
void ten_to_two(int firstNumber[])
{
}
//十进制转八进制
void ten_to_eight(int firstNumber[])
{
}
//十进制转十六进制
void ten_to_sixteen(int firstNumber[])
{
}
//十六进制转二进制
void sixteen_to_two(int firstNumber[])
{
}
//十六进制转八进制
void sixteen_to_eight(int firstNumber[])
{
}
//十六进制转十进制
void sixteen_to_ten(int firstNumber[])
{
}
int main()
{
char flag;
while(1)
{
int firstBase,lastBase,i;
// firstNumber[101] = {0};
printf("请输入被转换数的进制:\n");
scanf("%d",&firstBase);
getchar();
printf("请输入要转换数的位数:\n");
scanf("%d",&N);
getchar();
printf("请输入要转换的数:\n");
for(i=0;i<N;i++)
{
scanf("%d",&firstNumber[i]);
}
for(i=0;i<N;i++)
{
printf("%d",firstNumber[i]);
}
getchar();
printf("请输入要转换成的进制:\n");
scanf("%d",&lastBase);
getchar();
switch(firstBase)
{
case 2:
{
switch(lastBase)
{
case 8: two_to_eight(firstNumber);break;
case 10:two_to_ten(firstNumber);break;
case 16:two_to_sixteen(firstNumber);break;
default:
printf("没有这种进制!\n");
break;
}
break;
}
case 8:
{
switch(lastBase)
{
case 8: eight_to_two(firstNumber);break;
case 10:eight_to_ten(firstNumber);break;
case 16:eight_to_sixteen(firstNumber);break;
default:
printf("没有这种进制!\n");
break;
}
break;
}
case 10:
{
switch(lastBase)
{
case 2: ten_to_two(firstNumber);break;
case 8:ten_to_eight(firstNumber);break;
case 16:ten_to_sixteen(firstNumber);break;
default:
printf("没有这种进制!\n");
break;
}
break;
}
case 16:
{
switch(lastBase)
{
case 2: sixteen_to_two(firstNumber);break;
case 8:sixteen_to_eight(firstNumber);break;
case 10:sixteen_to_ten(firstNumber);break;
default:
printf("没有这种进制!\n");
break;
}
break;
}
default:
printf("没有这种进制\n");
break;
}
printf("是否继续转换:Y|N\n");
scanf("%c",&flag);
if('N' == flag)
break;
}
return 0;
}
*/
#include <string.h>
#define MAXCHAR 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); //逆序打印字符数组
main() {
int source; //原数制
int object; // 目标数制
int length; //转换后目标数制字符数组的长度
long decimal_num; //作为轴十进制
char temp[MAXCHAR]; //存储待转换的数值和转换后的数值
char flag;
while(1) {
printf("转换前的数为:");
scanf("%s",temp);
printf("转换前的数制是:");
scanf("%d",&source);
printf("转换后的数制是:");
scanf("%d",&object);
printf("转换后的数为:");
decimal_num = source_to_decimal(temp,source);
length = decimal_to_object(temp,decimal_num,object);
output(temp,length);
printf("是否继续转换:Y||N");
scanf("%c",&flag);
printf("%c\n",flag);
if(flag == 'N')
break;
}
}
int char_to_num(char ch) {
if(ch>='0'&&ch<='9')
return ch-'0';
else
return ch-'A'+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; i++)/*元素temp[0]转换成相应的数值后与变量decimal_num的初值相加(为不影响
最后的结果,decimal_num的初值应为0),把得到的和再次赋给decimal_num;decimal_num与第二个元
素temp[1]相加之前应先乘一次基数source,相加之后得到的最新数据依然赋值给变量;以此类推,直
到与最后一个有效元素相加,一共累加了有效长度N次,第一个元素与基数相乘N-1次,···最后一
个元素与基数相乘0次*/
{
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--) {
printf("%c",temp[i]);
}
printf("\n");
} //逆序打印字符数组