C語(yǔ)言實(shí)現(xiàn)常見進(jìn)制轉(zhuǎn)換的示例代碼
前言
生活中最常見的進(jìn)制是十進(jìn)制,而有一類編程題會(huì)要求將十進(jìn)制轉(zhuǎn)換為其他進(jìn)制,本篇博客將主要講述C語(yǔ)言中常見的幾類進(jìn)制轉(zhuǎn)換問(wèn)題。
一、十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)、八進(jìn)制數(shù)
方法:舉例將十進(jìn)制數(shù)100轉(zhuǎn)換為二進(jìn)制數(shù),就是將100與2相除,得到商以及余數(shù),再將商與2不斷相除,最終除到商為0。按順序記錄下余數(shù),再將余數(shù)逆序輸出,即為二進(jìn)制的結(jié)果。八進(jìn)制同理,商不斷與8相除,最終除到商為0,按順序記錄下余數(shù),再將余數(shù)逆序輸出,即八進(jìn)制的結(jié)果。此方法同樣可以推廣到要轉(zhuǎn)換成二到九的任何一種進(jìn)制。
圖形如下:
代碼如下:
#include <stdio.h> int main() { int x, n; scanf("%d %d", &x, &n);//x是要轉(zhuǎn)換的十進(jìn)制數(shù),n為要轉(zhuǎn)換成的進(jìn)制 int arr[100] = { 0 };//創(chuàng)建一個(gè)足夠大的數(shù)組來(lái)存放余數(shù) int i = 0,j = 0; while (x) { arr[i++] = x % n;//存放余數(shù),i最后的值正好是余數(shù)的個(gè)數(shù) x /= n; } for (j = i - 1; j >= 0; j--) { printf("%d", arr[j]);//余數(shù)倒序輸出 } printf("\n"); return 0; }
二、十進(jìn)制轉(zhuǎn)換為十六進(jìn)制
將十進(jìn)制轉(zhuǎn)換為十六進(jìn)制同樣需要用到將商不斷除16以及逆序輸出等方法,但由于十六進(jìn)制中會(huì)出現(xiàn)A\B\C\D\E\F等字符,所以還需要將取得的余數(shù)做進(jìn)一步轉(zhuǎn)換。代碼如下:
#include <stdio.h> int main() { int x; scanf("%d", &x); char arr[100] = { 0 };//因?yàn)槭M(jìn)制中會(huì)出現(xiàn)A\B\C\D\E\F等字符,所以保存余數(shù)的數(shù)組類型應(yīng)定義為char int i = 0, j = 0; while (x) { arr[i++] = x % 16; x /= 16; } for (j = 0; j < i; j++) { //將取出的余數(shù)轉(zhuǎn)換為對(duì)應(yīng)的字符 switch (arr[j]) { case 10:arr[j] = 'A'; break; case 11:arr[j] = 'B'; break; case 12:arr[j] = 'C'; break; case 13:arr[j] = 'D'; break; case 14:arr[j] = 'E'; break; case 15:arr[j] = 'F'; break; default:arr[j] += 48; } } for (j = i - 1; j >= 0; j--) { printf("%c", arr[j]);//逆序打印 } printf("\n"); return 0; }
三、二進(jìn)制數(shù)、八進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)
方法:需要將輸入的數(shù)的每一位取出,再與這個(gè)位上的權(quán)重相乘,最后相加得到結(jié)果。
代碼如下:
#include <stdio.h> #include <math.h> int main() { int n = 0, sum = 0, i = 0, x = 0; scanf("%d %d", &x, &n);//x為輸入的二進(jìn)制或八進(jìn)制的數(shù),n為進(jìn)制。 while (x) { sum += (x%10)*pow(n, i++);//x%10將x的每一位取出,再與這個(gè)位上的權(quán)重相乘。 x /= 10; } printf("%d\n", sum); return 0; }
四、十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)
十六進(jìn)制中含A\B\C\D\E\F等字符,所以在輸入的時(shí)候可以將其看成輸入一個(gè)字符串,需要先將每位上的字符轉(zhuǎn)換為對(duì)應(yīng)的數(shù)字與本位上的權(quán)重相乘,再相加得到最后的值。
代碼如下:
#include <stdio.h> #include <string.h> #include <math.h> int main() { char arr1[100] = { 0 }; scanf("%s", arr1); int len = strlen(arr1); int i = 0, sum = 0; for (i = 0; i<len; i++) { int temp = 0; switch (arr1[i]) { case 'A':temp = 10; break; case 'B':temp = 11; break; case 'C':temp = 12; break; case 'D':temp = 13; break; case 'E':temp = 14; break; case 'F':temp = 15; break; default:temp = arr1[i] - '0'; break; //將各個(gè)位上的字符轉(zhuǎn)換為對(duì)應(yīng)的數(shù)字 } sum += temp * pow(16, len-i-1);//各個(gè)位上的權(quán)重相乘再相加 } printf("%d\n", sum); return 0; }
到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)常見進(jìn)制轉(zhuǎn)換的示例代碼的文章就介紹到這了,更多相關(guān)C語(yǔ)言進(jìn)制轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)學(xué)生個(gè)人消費(fèi)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)生個(gè)人消費(fèi)管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C語(yǔ)言使用scanf連續(xù)輸入字符串出現(xiàn)的問(wèn)題
這篇文章主要介紹了C語(yǔ)言使用scanf連續(xù)輸入字符串出現(xiàn)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12在vscode中快速新建html文件的2種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于在vscode中快速新建html文件的2種方法,以及如何快速打開HTML文件查看編輯效果的方法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04C語(yǔ)言實(shí)現(xiàn)冒泡排序的思路以及過(guò)程
冒泡排序是最簡(jiǎn)單的排序方法,理解起來(lái)容易。雖然它的計(jì)算步驟比較多,不是最快的,但它是最基本的,初學(xué)者一定要掌握。本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09C語(yǔ)言實(shí)現(xiàn)數(shù)組的循環(huán)左移,右移,翻轉(zhuǎn)的示例
今天小編就為大家分享一篇C語(yǔ)言實(shí)現(xiàn)數(shù)組的循環(huán)左移,右移,翻轉(zhuǎn)的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07C語(yǔ)言實(shí)現(xiàn)經(jīng)典掃雷小游戲完整代碼(遞歸展開?+?選擇標(biāo)記)
這篇文章主要介紹了C語(yǔ)言小項(xiàng)目之掃雷游戲帶遞歸展開?+?選擇標(biāo)記效果,本代碼中,我們用字符?!?來(lái)標(biāo)識(shí)雷,文中附有完整代碼,需要的朋友可以參考下2022-05-05