C語言:進位制轉化
阿新 • • 發佈:2021-07-12
16進位制數4321轉10進位制:
原來方法 =4*16^3+3*16^2+2*16^1+1*16^0
=4*16^3+3*16^2+2*16^1+1
=16*(4*16^2+3*16^1+2)+1
=16*(16*(4*16^1+3)+2)+1
=16*(16*(16*(4+0)+3)+2)+1
#include <stdio.h> #include <math.h> #define MAXCHAR 101 /*最大允許字串長度*/ int char_to_num(char ch); /*返回字元對應的數字*/ char num_to_char(intnum); /*返回數字對應的字元*/ long source_to_decimal(char temp[], int source); /*返回由原數轉換成的10進位制數*/ long source_to_decimala(char temp[], int source); /*返回由原數轉換成的10進位制數*/ 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; /*儲存轉換成的10進位制數*/ char temp[MAXCHAR]; /*儲存待轉換的數值和轉換後的數值*/ int flag = 1; /*儲存是否退出程式的標誌*/ while(flag) /*利用輸入的flag值控制迴圈是否結束*/ { printf("轉換前的數是:"); scanf("%s", temp); printf("轉換前的數制是:"); scanf("%d", &source); printf("轉換後的數制是:"); scanf("%d", &object); printf("轉換後的數是:"); decimal_num = source_to_decimala(temp, source); length = decimal_to_object(temp, decimal_num, object); output(temp, length); printf("繼續請輸入1,否則輸入0:\n"); scanf("%d", &flag); } return 0; } /*將字元轉換成數字*/ 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); /*將0~9之間的數字轉換成字元*/ else return (char)('A'+num-10); /*將大於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; } long source_to_decimala(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 + char_to_num(temp[i])*pow(source,length-1-i); printf("%d ",temp[i]); } printf("\n%d\n",decimal_num); 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--) /*輸出temp陣列中的值*/ printf("%c", temp[i]); printf("\n"); }