天天看點

進制轉換C語言

給定一個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"); 
} 
           

繼續閱讀