[BaekJoon]3896小数列


1.  質問リンク


https://www.acmicpc.net/problem/3896

2.  質問する



サマリ

  • 連続する小数pとp+nがある場合、長さnの小数間の数列は、2つの小数間のn-1個の合成数(非小数または1の正の整数)を表す.
  • 例えば、小数31~37の間の数列{32,33,34,35,36}は、長さが6である.
  • 正の整数kが与えられた場合、kを含む小数列の長さを求める.
  • 入力:1行目のテストケース数はTであり、2行目からのTは1より大きい整数kであり、1299709以下である.
  • 出力:各テストケースについてkが合成数であればkを含む小数間の長さを出力し、kが合成数でなければ0を出力する.
  • 3.  ソースコード

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    
    public class Main {
    	public boolean isPrime(int num) {
    		for(int i = 2; i <= Math.sqrt(num); i++) {
    			if(num % i == 0) {
    				return false;
    			}
    		}
    		return true;
    	}
    	
    	public int[] getPrimeLength(int[] primes) {
    		int[] prime_length = new int[primes.length];
    		for(int i = 0; i < primes.length; i++) {
    			if(isPrime(primes[i])) {
    				prime_length[i] = 0;
    			} else {
    				int count1 = 0;
    				int count2 = 0;
    				int upper = primes[i] + 1;
    				int lower = primes[i] - 1;
    				boolean flag1 = false;
    				boolean flag2 = false;
    				while(true) {
    					if(!flag1) {
    						if(isPrime(upper)) {
    							flag1 = true;
    						} else {
    							count1++;
    							upper++;
    						}
    					}
    					if(!flag2) {
    						if(isPrime(lower)) {
    							flag2 = true;
    						} else {
    							count2++;
    							lower--;
    						}
    					}
    					if(flag1 && flag2) {
    						prime_length[i] = count1 + count2 + 2;
    						break;
    					}
    				}
    			}
    		}
    		return prime_length;
    	}
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    		int num = Integer.parseInt(br.readLine());
    		int[] primes = new int[num];
    		for(int i = 0; i < primes.length; i++) {
    			primes[i] = Integer.parseInt(br.readLine());
    		}
    		br.close();
    		Main m = new Main();
    		int[] prime_length = m.getPrimeLength(primes);
    		for(int i = 0; i < prime_length.length; i++) {
    			bw.write(prime_length[i] + "\n");
    		}
    		bw.flush();
    		bw.close();
    	}
    }

    4.  に近づく

  • この問題は、与えられたテストケースが少数であれば0を出力し、そうでなければ、その合成数から次の小数までの合成数およびその合成数から前の小数までの合成数を求めることによって、2つの小数間の合成数を求めることである.
  • 与えられた数字が小数であるかどうかをチェックし、小数であれば0を出力します.
  • 2からその数の平方根の間に1つの数がある場合、その数は小数ではなく、小数ではありません.
  • 小数でなければ、その数から1をインクリメントし、インクリメント数が小数であることを確認し、小数であればブール型はその数が小数であることを示し、小数でなければその数より大きい数に合成数を1つ増やす.
  • 2カウントを1ずつ増やし、小数になるまで繰り返します.
  • 2では、1を減らすごとに、1を減らす数が小数であることを確認し、小数であればbooleanタイプで小数であることを示し、小数でなければその数より小さい数に合成数を1つ増やす.
  • 4号課程は小数になるまで1単位で減算して繰り返します.
  • 3,5回の過程で、両方の数が小数であれば、その数より大きい数では、合成数の個数とその数より小さい数では、合成数の個数が加算され、与えられた数も合成数であるため、1が加算される.
  • 2つの小数の間のN-1個の数について、長さNの小数の間の数列と呼ぶので、7番目の過程で1を追加します.
  • 1~7各テストケースをテストし、各テストケースの結果を出力します.