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 JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.ArrayList;

// メインクラス
public class Main {
    // メインメソッド
    public static void main(String[] args) throws IOException {
        ArrayList<String> dataSet = inputDataSet("0"); // データセットを読み込む
        
        // 全てのデータセットに対し、処理を行う
        for(String line : dataSet){
            int n = Integer.parseInt(line);
        
            removeUnluckyNumber.showConvNum(n, 1); // 変換した数字を表示する
            System.out.println();
        }
    }
    
    // データセットを1行毎に格納したリストを返すメソッド
    // 入力の終端か、データセットの終端を示すterminalに達するまで読み込む
    public static ArrayList<String> inputDataSet(String terminal) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        ArrayList<String> dataSet = new ArrayList<String>();
        while(true){
            String line = br.readLine();
            if(line == null || line.equals(terminal))break;
            dataSet.add(line);
        }
        
        return dataSet;
    }
}

// 忌み数除去クラス
class removeUnluckyNumber{
    // 1桁(0~8)の変換表
    private static int[] convTable = {0, 1, 2, 3, 5, 7, 8, 9};
    
    //再帰により変換後の番号を1文字づつ表示していくメソッド
    public static void showConvNum(int n, int d){
        if(n == 0 || d > 10)return; // nが0になったか、深さが10を超えた場合、終了
        
        showConvNum(n >> 3, d + 1); // nを8で割り、再帰呼び出し
        System.out.print(convTable[n & 7]); // 8進数下1桁を変換して出力
    }
}