十進位制數與N進位制的轉換
阿新 • • 發佈:2018-12-12
題目
1)問題描述:將從鍵盤輸入的十進位制數轉換為N(如二進位制,八進位制,十六進位制)進位制資料。
2)要求:利用順序棧實現數制轉換問題
程式碼(c語言)
#include<stdio.h>
#include<stdlib.h>
//定義棧結構
typedef struct stack{
int num[50];
int tap;
}Stack;
//宣告函式
void setTable(char* table);
void push(int number);
int pop();
int isEmpty();
//宣告全域性變數
Stack *stack;
void main(){
int number,radix; //number-被轉換數 radix-轉換進位制
char table[36]; //定於數字字母匹配表
setTable(table);
printf("輸入十進位制數字:");
scanf("%d",&number);
printf("輸入要轉換的進位制:");
scanf("%d",&radix);
stack = (Stack*)malloc(sizeof(Stack));
stack->tap=0;
//短除法
while(true){
push( number % radix) ;
number = number/radix;
if(number == 0)break;
}
printf("結果為:");
while(isEmpty() == 0){
printf("%c",table[pop()]);
}
putchar(10);//換行
}
//填充數字字母表
void setTable(char table[]){
int i = 0;
for(;i<10;i++){
table[i]='0'+i;
}
for(;i<37;i++){
table[i]='A'+i-10;
}
}
//入棧
void push(int number) {
stack->num[stack->tap] = number;
stack->tap = stack->tap + 1;
}
//出棧
int pop(){
stack->tap = stack->tap - 1;
return stack->num[stack->tap];
}
//判斷是否為空
int isEmpty(){
if(stack->tap == 0)return 1;
else return 0;
}
解析
1.題目思路
因為這是一道10進位制轉換N進位制的題目,所以演算法應該採用短除法
EG:十進位制:10 轉換成 二進位制:1010
(第一次) 10%2 = 0 , 10/2 = 5
(第二次) 5 % 2 = 1 , 5/2 = 2
(第三次) 2 % 2 = 0 , 2/2 = 1
(第四次) 1 % 2 = 1 , 1/2 = 0
這時候發現規律了吧----短除演算法計算的結果是從低位開始的(逆序的)。
那麼,這樣一種方式就可以利用棧的先進後出特性來得到正確的結果。
2.實現的方法
- 需要有一張表可以表示0-9 A-Z的字元
- 在迴圈中,每次短除的餘數壓入棧中,直到被除數為0為止。需要得到結果的時候,再一個一個地出棧並且去數字字母表找到匹配字元進行儲存或者輸出。
小結
在一些需要逆序操作的時候,可以考慮下棧或者是遞迴