C/C++学习笔记:C语言实现任意进制转换,代码全解析!
問題描述
給定一個(gè) M 進(jìn)制的數(shù) x,實(shí)現(xiàn)對(duì) x 向任意的一個(gè)非 M 進(jìn)制的數(shù)的轉(zhuǎn)換。
問題分析
掌握不同數(shù)制間的轉(zhuǎn)換關(guān)系是解決問題的關(guān)鍵,這里所說的數(shù)制一般包括二進(jìn)制、八進(jìn)制、十六進(jìn)制及十進(jìn)制。除了不同的數(shù)制還有下面幾個(gè)必須要了解的概念。
基數(shù):在一種數(shù)制中,只能使用一組固定的數(shù)字來表示數(shù)的大小,這組固定的數(shù)字的個(gè)數(shù)就稱為該計(jì)數(shù)制的基數(shù)(Base)。例如十進(jìn)制的基數(shù)為10,二進(jìn)制的基數(shù)為2等。
權(quán):又稱為位權(quán)或權(quán)值,即每一個(gè)數(shù)位都有一個(gè)固定的基值與之相對(duì)應(yīng),稱之為權(quán)。如十進(jìn)制的個(gè)位對(duì)應(yīng)的權(quán)值為1(100),十位對(duì)應(yīng)的權(quán)值為10(101),百位對(duì)應(yīng)的權(quán)值為100(102)。對(duì)于一個(gè) M 進(jìn)制的數(shù)來說,小數(shù)點(diǎn)左邊各位上對(duì)應(yīng)的權(quán)值從右到左分別為基數(shù)的0次方、基數(shù)的1次方、基數(shù)的2次方等,對(duì)于小數(shù)點(diǎn)右邊各位上對(duì)應(yīng)的權(quán)值從左到右分別為基數(shù)的-1次方、基數(shù)的-2次方等。
二進(jìn)制、八進(jìn)制、十六進(jìn)制向十進(jìn)制轉(zhuǎn)換:按權(quán)展開相加。
十進(jìn)制轉(zhuǎn)換成二進(jìn)制、八進(jìn)制、十六進(jìn)制:整數(shù)部分除以基數(shù)取余數(shù)(取余的方向?yàn)閺暮笙蚯?#xff09;;小數(shù)部分乘以基數(shù)取整數(shù)(取整的方向?yàn)閺那跋蚝?#xff09;。
二進(jìn)制、八進(jìn)制、十六進(jìn)制相互轉(zhuǎn)換:先轉(zhuǎn)換成十進(jìn)制再轉(zhuǎn)換成其他進(jìn)制;或者按照其對(duì)應(yīng)關(guān)系進(jìn)行轉(zhuǎn)換(三位二進(jìn)制數(shù)對(duì)應(yīng)一位八進(jìn)制數(shù),四位二進(jìn)制數(shù)對(duì)應(yīng)一位十六進(jìn)制數(shù))。本例題按照前一種轉(zhuǎn)換方式進(jìn)行編程。
算法設(shè)計(jì)
十六進(jìn)制是由 0~F 這一組固定的數(shù)字來表示,所以釆用字符數(shù)組進(jìn)行存儲(chǔ)。在進(jìn)行輸入輸出時(shí)數(shù)組元素都是以字符的形式存在的,但是在進(jìn)行數(shù)制轉(zhuǎn)換時(shí)數(shù)組元素又以數(shù)值的形式存在,程序中用兩個(gè)自定義函數(shù) char_to_number 和 number_to_char 來實(shí)現(xiàn)字符與其對(duì)應(yīng)數(shù)值之間的轉(zhuǎn)換。
在執(zhí)行程序時(shí)可以輸入多組數(shù)據(jù)來驗(yàn)證程序的正確性,以前的程序都是多次運(yùn)行,輸入不同的數(shù)據(jù)來實(shí)現(xiàn)。對(duì)程序稍做改進(jìn),只運(yùn)行一次程序但可以輸入多組數(shù)據(jù)進(jìn)行驗(yàn)證。解決這個(gè)問題只需要加一層循環(huán),如果循環(huán)條件為真則繼續(xù)輸入數(shù)據(jù),否則退出。循環(huán)條件為真即表達(dá)式的值不為0,這樣可以聲明一個(gè)變量假設(shè)為 flag,利用語句 while(flag){循環(huán)體} 來進(jìn)行控制,當(dāng) flag 的值為1時(shí)可以接著輸入,若為0則結(jié)束循環(huán)。
下面是完整的代碼:
#include
#define MAXCHAR 101? /*最大允許字符串長(zhǎng)度*/
int char_to_num(char ch);? /*返回字符對(duì)應(yīng)的數(shù)字*/
char num_to_char(int num);? /*返回?cái)?shù)字對(duì)應(yīng)的字符*/
long source_to_decimal(char temp[], int source);? /*返回由原數(shù)轉(zhuǎn)換成的10進(jìn)制數(shù)*/
int decimal_to_object(char temp[], long decimal_num, int object);? /*返回轉(zhuǎn)換成目標(biāo)數(shù)制后字符數(shù)組的長(zhǎng)度*/
void output(char temp[], int length);? /*將字符數(shù)組逆序打印*/
int main()
{
int source;? /*存儲(chǔ)原數(shù)制*/
int object;? /*存儲(chǔ)目標(biāo)數(shù)制*/
int length;? /*存儲(chǔ)轉(zhuǎn)換成目標(biāo)數(shù)制后字符數(shù)組的長(zhǎng)度*/
long decimal_num;? /*存儲(chǔ)轉(zhuǎn)換成的10進(jìn)制數(shù)*/
char temp[MAXCHAR];? /*存儲(chǔ)待轉(zhuǎn)換的數(shù)值和轉(zhuǎn)換后的數(shù)值*/
int flag = 1;? /*存儲(chǔ)是否退出程序的標(biāo)志*/
while(flag)? /*利用輸入的flag值控制循環(huán)是否結(jié)束*/
{
printf("轉(zhuǎn)換前的數(shù)是:");
scanf("%s", temp);
printf("轉(zhuǎn)換前的數(shù)制是:");
scanf("%d", &source);
printf("轉(zhuǎn)換后的數(shù)制是:");
scanf("%d", &object);
printf("轉(zhuǎn)換后的數(shù)是:");
decimal_num = source_to_decimal(temp, source);
length = decimal_to_object(temp, decimal_num, object);
output(temp, length);
printf("繼續(xù)請(qǐng)輸入1,否則輸入0:");
scanf("%d", &flag);
}
return 0;
}
/*將字符轉(zhuǎn)換成數(shù)字*/
int char_to_num(char ch)
{
if(ch>='0' && ch<='9')
return ch-'0';? /*將數(shù)字字符轉(zhuǎn)換成數(shù)字*/
else
return ch-'A'+10;? /*將字母字符轉(zhuǎn)換成數(shù)字*/
}
char num_to_char(int num)
{
if(num>=0 && num<=9)
return (char)('0'+num-0);? /*將0~9之間的數(shù)字轉(zhuǎn)換成字符*/
else
return (char)('A'+num-10);? /*將大于10的數(shù)字轉(zhuǎn)換成字符*/
}
long source_to_decimal(char temp[], int source)
{
long decimal_num = 0;? /*存儲(chǔ)展開之后的和*/
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);? /*求出余數(shù)并轉(zhuǎn)換為字符*/
decimal_num = decimal_num / object;? /*用十進(jìn)制數(shù)除以基數(shù)*/
i++;
}
temp[i]='\0';
return i;
}
void output(char temp[], int length)
{
int i;
for( i=length-1; i>=0; i--)? /*輸出temp數(shù)組中的值*/
printf("%c", temp[i]);
printf("");
}
運(yùn)行結(jié)果:
?
總結(jié)
以上是生活随笔為你收集整理的C/C++学习笔记:C语言实现任意进制转换,代码全解析!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超级棒的免费前端学习路线
- 下一篇: C/C++编程笔记:数据结构二叉树的查找