常用的進制有四種:二進制、八進制、十進制、十六進制。他們之間都可以進行倆倆的互相轉換;
有一種轉換方法為余數法,其轉換思想與棧的存儲正好適應。適用於十進制轉換為二進制、八進制、十六進制;
余數法:連續除以基,直到商為0,從低到高紀錄數值為轉換結果。
因為結果是從低到高紀錄的所以使用到棧,先將結果全部入棧之后再全部出棧。
實現函數代碼(用到之前寫的數據結構-棧的順序表達結構的頭文件):
1void conversion(int a, int b) //參數為從a進制轉換為b進制
2 { 3 int num = 0; 4 char z = 'A'; 5 printf("請輸入你想要轉換的%d進制數",a); 6 scanf("%d", &num); 7 while(num) 8 { 9 Push(Scale, num%b); //取余數逐個進棧 10 num /=b; //求商 11 } 12 int e = 0; 13 printf("轉換為%d進制數為:", b); 14 while(!StackEmpty(Scale)) 15 { 16 Pop(Scale, e); //逐個出棧 17 if(e >= 10 && e <= 15) //結果為十六進制時用到轉換為字母 18 printf("%c", z+e-10); 19 else 20 printf("%d", e); 21 } 22 printf("\n"); 23 }
這樣就用棧實現了由十進制轉換為其他進制的算法。
接下來我們討論下其他的進制轉換為十進制的算法:實現方法可以用按權展開法,想了想。這種方法並沒有什么好的算法解決。無非是兩個循環嵌套,外循環一位位的走,內循環將每一位進行求冪。因為並沒有涉及數據結構的思想(我認為這樣寫很麻煩)所以就只是討論討論實現方法,就不拋出代碼了。等我想到更好的解決方法后在補上。
好了,現在與十進制有關的轉換都實現了,還剩下三類:1、二進制與八進制;2、二進制與十六進制;3、八進制與十六進制;其實這三類都一樣的實現。都先轉換為十進制在用十進制余數法用棧去求。這樣這三類就可以用上面介紹的與十進制有關的轉換方法實現了;其實在解決其他進制轉換為十進制上,如果只是輸出的話完全可以用printf格式化輸出實現。%o八進制輸出,%x十六機制輸出,%d十進制輸出。當是格式化輸出里沒有對應的二進制輸出,這點只能寫函數實現。