進位制轉換的那些事兒
進位制轉換的那些事兒
進位制轉換是一種較為特殊的數位拆解
以下解釋部分來源:知乎網友
進位制這事兒,說到底就是位值原理,即:同一個數字,放在不同的數位上,代表不同大小的“量”。例如:十進位制中,百位上的1表示100,十位上的1表示10。
任何進制中,每個數都可以按位權展開成各個數位上的數字乘以對應數位的位權,再相加的形式,如:
十進位制的123=1×100+2×10+3×1
十進位制的9876=9×1000+8×100+7×10+6×1
問:為啥相應的數位是1000、100、10、1?為啥不是4、3、2、1?
答:十進位制,滿十進一,再滿十再進一,因此要想進到第三位,得有10×10;第4位得有10×10×10
這樣我們就知道了:
對10進位制,從低位到高位,依次要乘以10^0,10^1,10^2,10^3……,也就是1、10、100、1000
對2進位制,從低位到高位,依次要乘以2^0,2^1,2^2,2^3……,也就是1、2、4、8……
總之,n
進位制k
轉換成m
進位制t
,只需先將n
進位制k
轉換成十進位制q
,再將十進位制q
轉換成m
進位制t
題目描述
求任意兩個不同進位制非負整數的轉換(2進位制~16進位制),所給整數在long所能表達的範圍之內。
輸入
輸入只有一行,包含三個整數a,n,b。a表示其後的n 是a進位制整數,b表示欲將a進位制整數n轉換成b進位制整數。a,b是十進位制整數,2 =< a,b <= 16。
輸出
可能有多組測試資料,對於每組資料,輸出包含一行,該行有一個整數為轉換後的b進位制數。輸出時字母符號全部用大寫表示,即(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; }
總結
1.字元轉換,根據ACSII碼,進行數字與字元之間的轉換。
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; }