Problem:
病院の部屋番号

ウォーターデブンに住む建築家のデブンキーさんのもとに、古い大病院を改装する仕事の依頼が舞い込んできました。

国によっては忌み数(いみかず)として嫌われる数字を部屋番号に用いたくない人がいます(日本では 4 と 9 が有名です)。しかし、この病院の部屋番号は忌み数に関係なく、1 から順番に付けられていました。

それが気になったデブンキーさんは、機材やベッドの入れ替えが全て終わる前にウォーターデブンの忌み数である「4」と「6」を除いた数字で部屋番号を付けなおしてしまいました。しかし、入れ替え作業は旧部屋番号で計画していたので、残りの作業を確実に行うには旧部屋番号を新部屋番号に変換する必要があります。計算が苦手なデブンキーさんはこのことに気づいて愕然としています。

そんなデブンキーさんのために、旧部屋番号を入力とし対応する新部屋番号を出力するプログラムを作成してください。

15 番目までの部屋番号の対応表は以下のようになります。

旧部屋番号

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

新部屋番号

1

2

3

5

7

8

9

10

11

12

13

15

17

18

19

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットとして、旧部屋番号を表す整数 n (1 ≤ n ≤ 1,000,000,000) が１行に与えられます。

データセットの数は 30000 を超えません。

Output

入力データセットごとに、新部屋番号を１行に出力します。

Sample Input

15
100
1000000000
3
0

Output for the Sample Input

19
155
9358757000
3

Solution in C (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <math.h>

long long memo[20];

long long get_add(long long input);

long long get_add2(long long count) {
	int count2=(int)(log10(count)+0.1);
	long long result;
	if(memo[count2]>0)return memo[count2]-1;
	result=get_add(count-1);
	memo[count2]=result+1;
	return result;
}

long long get_add(long long input) {
	long long result=0;
	long long input2;
	long long input3;
	long long count;
	if(input<=0)return 0;
	for(input2=input,count=1;input2>=10;input2/=10,count*=10);
	input3=input2;
	if(input2>=4){result+=count;input3--;}
	if(input2>=6){result+=count;input3--;}
	result+=get_add(input-input2*count);
	result+=get_add(count-1)*input3;
	return result;
}

int main(void) {
	long long input;
	long long n_add,p_add;
	while(1) {
		scanf("%lld",&input);
		if(input==0)break;
		p_add=0;
		while((n_add=get_add(input))>p_add) {
			input+=n_add-p_add;
			p_add=n_add;
		}
		printf("%lld\n",input);
	}
	return 0;
}