題目描述
將十進制數轉換為八進制,並輸出。
圖:將十進制數轉換為八進制並輸出
輸入格式
輸入包含若干十進制正整數。
輸出
輸出相應的八進制數,每個占一行。
樣例輸入
1
2
3
7
8
9
19
10020345
樣例輸出
1
2
3
7
10
11
23
46162771
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<math.h> /* floor(),ceil(),abs() */
/* 函數結果狀態代碼 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int Status; /* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */
typedef int Boolean; /* Boolean是布爾類型,其值是TRUE或FALSE */
#define STACK_INIT_SIZE 10 /* 存儲空間初始分配量 */
#define STACKINCREMENT 2 /* 存儲空間分配增量 */
typedef int SElemType; /* 定義棧元素類型為整型 */
typedef struct SqStack
{
SElemType *base; /* 在棧構造之前和銷毀之後,base的值為NULL */
SElemType *top; /* 棧頂指針 */
int stacksize; /* 當前已分配的存儲空間,以元素為單位 */
} SqStack; /* 順序棧 */
Status InitStack(SqStack *S)
{
/* 構造一個空棧S */
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存儲分配失敗 */
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack *S,SElemType e)
{
/* 插入元素e為新的棧頂元素 */
if((*S).top-(*S).base>=(*S).stacksize) /* 棧滿,追加存儲空間 */
{
(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存儲分配失敗 */
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
}
*((*S).top)++=e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
/* 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR */
if((*S).top==(*S).base)
return ERROR;
*e=*--(*S).top;
return OK;
}
Status StackEmpty(SqStack S)
{
/* 若棧S為空棧,則返回TRUE,否則返回FALSE */
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
void conversion(int n) /* 算法3.1 */
{
/* 對於輸入的任意一個非負十進制整數,打印輸出與其等值的八進制數 */
SqStack s;
SElemType e;
InitStack(&s); /* 初始化棧 */
while(n) /* 當n不等於0 */
{
Push(&s,n%8); /* 入棧n除以8的余數(8進制的低位) */
n=n/8;
}
while(!StackEmpty(s)) /* 當棧不空 */
{
Pop(&s,&e); /* 彈出棧頂元素且賦值給e */
printf("%d",e); /* 輸出e */
}
printf("\n");
}
int main()
{
int n;
while(~scanf("%d",&n))
{
conversion(n);
}
return 0;
}