給定一個M進制的數x,實作對x向任意的一個非M進制的數轉換。
分析:
二進制、八進制、十六進制向十進制轉換:按權展開相加;十進制轉換成二進制、八進制、十六進制:整數部分除以基數取餘數(取餘的方向為從後向前);小數部分乘以基數取整數(取整的方向為從前向後)。
-
将輸入或存儲的字元轉換為對應的數字,我們可以分兩類進行考慮。
第一類是介于’0’到’9’之間的字元,轉換成相應的數字0~9時,可利用其ASCII碼之間的
對應關系。字元’0’的ASCII碼為48,’1’的ASCII碼為49,’1’-‘0’=1得到的差即為字元
ch對應的數字。第二類是介于”A’到’Z’之間的字元,字元’A’對應的數字為10,’B’對應
的數字為11,對于此類字元可以利用公式ch-‘A’+10得到對應的數字
-
同理,數字轉換為對應字元時也分
兩種情況,一種是0~9之間的數字,隻需用字元’0’的ASCII碼加上相應的數值,然後進行強制類型轉換将其
轉換成字元型即可;另一種是大于等于10的數值,同樣利用對應的ASCII碼加上此時的數值與10的差即可,即
‘A’+num-10。
#include<stdio.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,int object);
//轉換後新數輸出
void output(char temp[],int length);
void main()
{
int source;
int object;
int length;
long decimal_num;
char temp[MAXCHAR];
int flag=;
while(flag)
{
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("繼續請輸入1,否則輸入0:\n;");
scanf("%d",&flag);
}
}
int char_to_num(char ch)
{
if(ch>='0' && ch<='9')
return ch-'0';
else
return ch-'A'+;
}
char num_to_char(int num)
{
if(num>= && num<=)
return (char)('0'+num-);
else
return (char)('A'+num-);
}
long source_to_decimal(char temp[],int source)
{
long decimal_num = ;
int length;
int i;
for(i=;temp[i]!='\0';i++);
length = i;
for(i=;i<=length-;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;
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-;i>=;i--)
printf("%c",temp[i]);
printf("\n");
}