Problem:
ハミング数

1 に 2, 3, 5 を何回か (0 回以上) かけ算して得られる数をハミング数 (Hamming numbers) と呼びます。例えば、

1

1 × 2 × 2 = 4

1 × 2 × 2 × 3 × 5 × 5 = 300

などはハミング数ですが、11, 13, 14 などはハミング数ではありません。

ハミング数はどれも 60 のべき乗を割り切る(例えば、54 は 603 = 21600 を割り切る) ので、時刻など 60 進法の計算には都合の良い数として昔から知られていました。また、楽器の調律に用いる音階の一つである純正律では、音の周波数の比が 24, 27, 30, 32, 36, 40, 45, 48 というハミング数からなる数列になります。

整数 m、n を入力とし、m 以上 n 以下のハミング数の個数を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。

各データセットとして、２つの整数 m と n (1 ≤ m, n ≤ 1000000, m ≤ n) が空白区切りで１行に与えられます。

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

Output

データセットごとに m 以上 n 以下のハミング数の個数を１行に出力します。

Sample Input

3 8
1 27
1 86
0

Output for the Sample Input

5
17
31

Solution in C# (judge verdict: Accepted)

using System;

namespace AOJ.Volume1
{
    public class HammingNumber
    {
        private static bool Check(int x)
        {
            // ハミング数チェック
            // ハミング数は2,3,5以外の約数を持たない

            // 5で割る
            while (x % 5 == 0) { x = x / 5; }
            if (x == 1) { return true; }

            // 3で割る
            while (x % 3 == 0) { x = x / 3; }
            if (x == 1) { return true; }

            // 2で割る
            while (x % 2 == 0) { x = x / 2; }
            if (x == 1) { return true; }

            return false;
        }

        public static int Main()
        {
            while (true)
            {
                string input = Console.ReadLine();
                if (input == "0") { break; }

                int pos = input.IndexOf(' ');
                int m = int.Parse(input.Substring(0, pos));
                int n = int.Parse(input.Substring(pos + 1));

                int answer = 0;
                for (int i = m; i <= n; i++)
                {
                    if (Check(i)) { answer++; }
                }

                Console.WriteLine(answer);
            }
            return 0;
        }
    }
}