ブルーブリッジカップの質問0410

1.ビルエラー

タイトルの説明:
特定の秘密関連ユニットが特定の種類の請求書を発行し、それらのすべてが年末に回収される必要があります。

各請求書には一意のID番号があります。すべての請求書のID番号は年間を通じて連続していますが、IDの開始番号はランダムに選択されます。

スタッフの過失により、ID番号の入力時にエラーが発生し、IDが破損し、別のIDに番号が付け直されました。

あなたの仕事は、プログラミングを通じて壊れた番号のIDと複数の番号のIDを見つけることです。

最大数と最小数で数の破損は発生しないと想定されています。

プログラムは、その後に続くデータ行の数を示すために、最初に整数N(N <100)を入力する必要があります。
次に、N行のデータを読み取ります。
各行のデータ長は等しくなく、スペース(100000以下)で区切られた正の整数(100以下)の
数です各整数はID番号を表します。

プログラムは、スペースで区切られた2つの整数mnを含む1行を出力する必要があります。
このうち、mは壊れたIDを表し、nは複数のIDを表します

例:
ユーザー入力:
2
5 6 8 11 9
10 12 9

次に、プログラム出力:
7 9

別の例:
ユーザー入力:
6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107112 192 103 131 133 169 158
128 102110 148 139 157 140 195 197 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119

次に、プログラム出力:
105 120

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {

    private static Scanner input;

    public static void main(String[] args) {
        input = new Scanner(System.in);
        ArrayList list = new ArrayList<Integer>();

        int N = input.nextInt();
        input.nextLine(); // 去掉整数后面的换行符
        for (int i = 0; i < N; i++) {
            String line = input.nextLine();
            String[] split = line.split(" ");
            for (int j = 0; j < split.length; j++) {
                list.add(Integer.parseInt(split[j]));
            }
        }
        
        Collections.sort(list); // 对集合进行排序
        int a = 0, b = 0; // a接收断号的 b接收重号的
        for (int i = 1; i < list.size(); i++) {
            int cur = (int) (list.get(i));
            int pre = (int) (list.get(i - 1));
            if (cur - pre == 2) {
                a = (int)(list.get(i)) - 1;
            }
            if (cur - pre == 0) {
                b = (int)(list.get(i));
            }
        }
        System.out.println(a + " " + b);
    }

}

2.ラッキーナンバー

タイトルの説明
ラッキーナンバーは、ポーランドの数学者ウラムによって命名されました。素数の生成と同様の「ふるい法」を使用して生成されます。

まず、自然数1、2、3、4、5、6、...を記述します。

1は最初のラッキーナンバーです。
番号2から始めます。シリアル番号が2で割り切れるアイテムをすべて削除すると、次のようになります。

1 _ 3 _ 5 _ 7 _ 9…

それらを締めて、次のように並べ替えます。

1 3 5 7 9…。このとき、3は2番目のラッキーナンバーなので、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つの正の整数mnを入力します(m <n <1000 * 1000)
プログラムは、mとn(mとnを除く)の間のラッキーナンバーの数を出力します。

例:
ユーザー入力:
1 20
プログラム出力:
5

例:
ユーザー入力:
30 69
プログラム出力:
8

リソース規約:
ピークメモリ消費(仮想マシンを含む)<64M
CPU消費<2000ms

要件に従って厳密に出力し、「入力してください...」のような余分なコンテンツを印刷しないでください。

すべてのコードは同じソースファイルに配置されます。デバッグ後、ソースコードをコピーして送信します。
注:パッケージステートメントは使用しないでください。jdk1.6以降の機能は使用しないでください。
注:メインクラスの名前はMainでなければなりません。そうでない場合、無効なコードとして扱われます。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class 幸运数 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        
        List<Integer> list = new ArrayList<>();
        for(int i=1;i<=m;i++){
            list.add(new Integer(i));
        }
        
        int luck = 2; //幸运数
        int k = 1;  //下标
        List<Integer> remove = new ArrayList<>();  //等待被移除的数字
        while(luck<=list.size()){
            int cnt = 0;//代表list中目前删除了几个数字
            for(int i=luck;i<=list.size();i++){  
                if(i%luck==0){
                    remove.add(i);
                }
            }
            
            
            for(int j=0;j<remove.size();j++){//将下标为remove中的数字移除
                list.remove(remove.get(j)-(cnt++)-1);
            }
            remove.clear();

            luck = list.get(k++);
        }
        int count = 0;
        for(int i=0;i<list.size();i++){
            if(list.get(i)>n&&list.get(i)<m){
                count++;
            }
        }
        System.out.println(count);
    }
}
import java.util.Scanner;  
public class Main {  
    static int G[]=new int [1000*1000+1];
    static int n;
    public static void main(String []args)  
    {  
        Scanner cs = new Scanner(System.in); 
        int m=cs.nextInt();
        n=cs.nextInt();
        //首先从1开始写出自然数1,2,3,4,5,6,....
        for(int i=1;i<=n;i++){
            G[i]=i;
        }
        //从2这个数开始。把所有序号能被2整除的项删除
        f(2);
        int xuhao=2;
        while(G[xuhao]<=pr1()){  //一直取幸运数,幸运数依次是数组中下标为2、3、4、5、6……对应的值
            f(G[xuhao]);
            xuhao++;
        }
        //计算结果
        int answer=0;
        for(int i=1;i<=n;i++){
            if(G[i]>=n)   //当G[i]超出n就不必要再算下去了
                break;
            if(G[i]>m)
                answer++;
        }
        System.out.println(answer);
    }
    static int pr1(){   //计算缩减后数组的长度,为了进一步加快算法的速度,避免每次都遍历整个n长度的数组
        int i=1;
        while(G[i]>0){
            i++;
        }
        return i-1;
    }
    static void f(int xuhao){  //删除对应位置的元素后缩紧
        for(int i=xuhao;i<=n;i+=xuhao){
                G[i]=0;
        }
        int j=1;
        for(int i=1;i<=n;i++){   //把它们缩紧,重新记序
            if(G[i]>0){
                int temp=G[i];
                G[i]=0;
                G[j++]=temp;
            }
        }
    }
}  
元の記事を44件公開 Likes2 訪問数540

おすすめ

転載: blog.csdn.net/qq_43699776/article/details/105442539