【2013年地方試験問題】ラッキーナンバー


記事のディレクトリ


ラッキーナンバー

ラッキーナンバーには波兰数学家乌拉姆名前付けられており、素数を生成するのと同様の「ふるい法」を使用して生成されます。

  • まず、1から始まる自然数を書きます。1,2,3,4,5,6.....

  • 1これは最初のラッキーナンバーです。2から始めます。すべて入れてシリアルナンバー分割可能な項目は削除され、1_3_5_7_9.......

  • それらを縮小し、次のように並べ替えます。1,3,5,7,9....現時点では、32番目のラッキーナンバーについては、3で割り切れるシーケンスナンバーのすべてのナンバーを注意,是序号位置,不是那个数本身能否被3整除!!削除します(削除されたナンバー5、11、17 ...である必要があります)。

  • このとき、7は3番目のラッキーナンバーであり、7で割り切れる数の位置を削除します(19、39、...)

  • 最後に残っているシーケンスも同様です。
    1,3,7,9,13,15,21,25,31,33,37,43,49,51,63,67,69,73,75,79.....

この質問には次のものが必要です。スペースで区切って
2つの正の整数を入力m nします(m <n <1000 * 1000)
プログラムは、mからnまでのラッキーナンバーの数を出力します(不包含m和n

例如1:
   用户输入:
    1 20
   程序输出:
    5
例如2:
   用户输入:
    30 69
   程序输出:
    8

ここに画像の説明を挿入

これは主にタイトルの説明に基づいてコードの論理表現に変換します。最初に、長さnの配列を宣言し、奇数に初期化できます。これは、すべての偶数を削除することと同じです。ラッキーナンバーを表す変数を宣言します。添え字ループ内で、現在の添え字にラッキーナンバーを添えることができるかどうかを判断します。

対応する数字は割り切れます。割り切れる場合は、現在の添え字に対応する数字を削除する必要がありますが、現状では何もしません。割り切れない場合は、現在の数字を削除できません。削除しない番号を前に移動し、前に削除する必要のある番号を上書きする方法なので变量p、現在の添え字に対応する番号をどこに移動するかを記録する必要があります。削除された番号は0-pに対応する配列位置にあり、pの後の番号も削除されておらず、一部の位置で番号が重複している可能性があります。

このとき、ラッキーナンバーの添え字に1を追加して、現在の配列の対応する要素が解決する必要のある正しい間隔以上であるかどうかを確認する必要があります。判断が正しい場合は、終了する必要があります。最も外側のwhileループがない場合は、上記のスクリーニングを続行します。

次の数字が均等に割り切れない場合、前の数字が上書きされ、後ろに行くときに均等に割り切れない数字が少ないほど、それらのほとんどは過去に前進することがわかっています。

package 蓝桥杯;

import java.util.Arrays;
import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;

public class Test06_幸运数 {
    
    

    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        // 构建数组
        int[] array = new int[n];
        for (int i = 0; i < n; i++) {
    
    
            array[i] = 2 * i + 1;
        }
        // 定义幸运数的下标
        int luck_index = 1;
        while (true) {
    
    
            // 记录数字向前挪动的坑位
            int p = luck_index + 1;
            for (int i = 1 + luck_index; i < n; i++) {
    
    
                if ((i + 1) % array[luck_index] == 0) {
    
    

                } else {
    
    
                    array[p] = array[i];
                    p++;
                }
                if (array[i] > n) {
    
    
                    break;
                }
            }

            for (int i = 0; i < n; i++) {
    
    
                System.out.print(array[i] + " ");
            }
            System.out.println();

            luck_index++; // 幸运数不断前移
            if (array[luck_index] >= n) {
    
    
                break;
            }
        }

        int ans = 0;
        for (int i = 0; i < n; i++) {
    
    
            if (array[i] >= n) {
    
    
                break;
            }
            if (array[i] > m) {
    
    
                ans++;
            }
        }
        System.out.println(ans);
    }

}

ここに画像の説明を挿入

トップに戻る


おすすめ

転載: blog.csdn.net/qq_45797116/article/details/113884315