#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100		// 存储空间初始分配量
#define STACKINCREMENT 10		// 存储空间分配增量
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW 0				// 栈分配溢出

typedef int SElemType;			// 定义堆栈元素的类型

typedef struct {
	SElemType * base;			// 在栈构造之前和销毁之后,base的值为NULL
	SElemType * top;			// 栈顶指针
	int stacksize;				// 当前已分配的存储空间,以元素为单位
}SqStack;

Status InitStack(SqStack &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;
}// InitStack

Status GetTop(SqStack S, SElemType &e){
	// 若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK;否则返回 ERROR
	if(S.top == S.base) return ERROR;
	e = *(S.top-1);
	return OK;
}// GetTop

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;
} // Push

Status Pop(SqStack &S, SElemType &e){
	// 若栈不为空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK;否则返回 ERROR
	if(S.top == S.base) return ERROR;
	e = * --S.top;
	return OK;
} // Pop

Status StackEmpty(SqStack S){
	// 若栈 S 为空栈,则返回 TRUE,否则返回 FALSE
	return S.top == S.base;
} // StackEmpty

void conversion(int Num) { // 算法3.1
	// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
	SElemType e;
	SqStack S;
	InitStack(S); // 构造空栈
	while (Num) {
		Push(S, Num % 8);
		Num = Num / 8;
	}
	while (!StackEmpty(S)) {
		Pop(S, e);
		printf("%d", e);
	}
	printf("\n");
} // conversion

int main(){
	int num;
	while(scanf("%d", &num) != EOF){
		conversion(num);
	}

	return 0;
}

/**************************************************************
	Problem: 2142
	User: admin
	Language: C++
	Result: Accepted
	Time:18 ms
	Memory:1144 kb
****************************************************************/