进制转换的那些事儿
進(jìn)制轉(zhuǎn)換的那些事兒
進(jìn)制轉(zhuǎn)換是一種較為特殊的數(shù)位拆解以下解釋部分來源:知乎網(wǎng)友
進(jìn)制這事兒,說到底就是位值原理,即:同一個(gè)數(shù)字,放在不同的數(shù)位上,代表不同大小的“量”。例如:十進(jìn)制中,百位上的1表示100,十位上的1表示10。
任何進(jìn)制中,每個(gè)數(shù)都可以按位權(quán)展開成各個(gè)數(shù)位上的數(shù)字乘以對應(yīng)數(shù)位的位權(quán),再相加的形式,如:
十進(jìn)制的123=1×100+2×10+3×1
十進(jìn)制的9876=9×1000+8×100+7×10+6×1
問:為啥相應(yīng)的數(shù)位是1000、100、10、1?為啥不是4、3、2、1?
答:十進(jìn)制,滿十進(jìn)一,再滿十再進(jìn)一,因此要想進(jìn)到第三位,得有10×10;第4位得有10×10×10
這樣我們就知道了:
對10進(jìn)制,從低位到高位,依次要乘以10^0,10^1,10^2,10^3……,也就是1、10、100、1000
對2進(jìn)制,從低位到高位,依次要乘以2^0,2^1,2^2,2^3……,也就是1、2、4、8……
總之,n進(jìn)制k轉(zhuǎn)換成 m進(jìn)制t,只需先將n進(jìn)制k轉(zhuǎn)換成十進(jìn)制q,再將十進(jìn)制q轉(zhuǎn)換成m進(jìn)制t
題目描述
求任意兩個(gè)不同進(jìn)制非負(fù)整數(shù)的轉(zhuǎn)換(2進(jìn)制~16進(jìn)制),所給整數(shù)在long所能表達(dá)的范圍之內(nèi)。不同進(jìn)制的表示符號為(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
輸入
輸入只有一行,包含三個(gè)整數(shù)a,n,b。a表示其后的n 是a進(jìn)制整數(shù),b表示欲將a進(jìn)制整數(shù)n轉(zhuǎn)換成b進(jìn)制整數(shù)。a,b是十進(jìn)制整數(shù),2 =< a,b <= 16。輸出
可能有多組測試數(shù)據(jù),對于每組數(shù)據(jù),輸出包含一行,該行有一個(gè)整數(shù)為轉(zhuǎn)換后的b進(jìn)制數(shù)。輸出時(shí)字母符號全部用大寫表示,即(0,1,...,9,A,B,...,F)。樣例輸入
15 Aab3 7樣例輸出
210306代碼塊
int main() {int a, b;char n[40];while (scanf("%d%s%d", &a, n, &b)!=EOF) {int size1 = strlen(n);int res=0;for (int i = size1-1; i >= 0; i--){int x;if (n[i] >= '0' && n[i] <= '9') {x = n[i] - '0';}else if (n[i] >= 'a' &&n[i] <= 'z') {x = n[i] - 'a'+10;}else{x= n[i] - 'A' + 10;}res += x * pow(a, size1 - i - 1);}char ans[40];int size = 0;while (res != 0) {int t = res%b;if (t < 10) {ans[size++] = t + '0';}else {ans[size++] = t - 10 + 'A';}res /= b;}for (int i = size-1; i>=0 ; i--){printf("%c", ans[i]);}printf("\n");}return 0; }總結(jié)
1.字符轉(zhuǎn)換,根據(jù)ACSII碼,進(jìn)行數(shù)字與字符之間的轉(zhuǎn)換。 if (n[i] >= '0' && n[i] <= '9') {x = n[i] - '0';}else if (n[i] >= 'a' &&n[i] <= 'z') {x = n[i] - 'a'+10;}else{x= n[i] - 'A' + 10;}總結(jié)
- 上一篇: atcoder 2643 切比雪夫最小生
- 下一篇: 微服务架构:如何用十步解耦你的系统?