[BaekJoon]288774と7


1.  質問リンク


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

2.  質問する



サマリ

  • 4および7のみからなる数では、Kが与えられた場合、問題はK番目の小数を求めることである.
  • を入力します.最初の行のK値は1以上、10^9以下です.
  • 出力:1行目にK小数を出力します.
  • 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 String getMinNum(int num) {
    		String[] two_cipher = {"44", "47", "74", "77"};
    		if(num == 1) {
    			return "4";
    		} else if(num == 2) {
    			return "7";
    		} else  if(num > 2 && num <= 6) {
    			return two_cipher[num - 3];
    		}
    		String result = "";
    		int copy = num;
    		int cipher = 0;
    		while(copy > 0) {
    			cipher++;
    			copy -= Math.pow(2, cipher);
    		}
    		copy += Math.pow(2, cipher);
    		for(int i = cipher; i > 1; i--) {
    			if(i == 2) {
    				result += two_cipher[copy - 1];
    			} else {
    				if(copy <= (Math.pow(2, i) / 2)) {
    					result += "4";
    				} else {
    					result += "7";
    					copy -= (Math.pow(2, i) / 2);
    				}
    			}
    		}
    		return result;
    	}
    	
    	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());
    		br.close();
    		Main m = new Main();
    		bw.write(m.getMinNum(num) + "\n");
    		bw.flush();
    		bw.close();
    	}
    }

    4.  に近づく

  • 4と7からなる数字だけで、1桁増加するごとに、その数は前の桁の2倍になります.
  • の場合、各ビット数のうち、前半の最大ビット数は4、後半の最大ビット数は7となる.
  • また、最大桁数が4の数と7の数のうち、n番目の数は最大桁数を除いた数に等しく、その残数は現在の桁数を下回る数のうちn番目の数に等しい.
  • 例えば、29番目の小さい数字を検索すると、
  • は1桁が2桁、2桁が4桁、3桁が8桁、4桁が16桁であるため、29番目の小さい桁は3桁の14より大きく、4桁の30より小さいため、4桁である.
  • また、29は14+(16/2)より大きい数字であるため、4桁では後ろが半分、前が7となる.
  • 29桁は4桁のうち15位、上位7桁は7桁のうち7位で、上位7桁の数字が続く.
  • 歳では7位が774だったため、29位が7774だった.
  • で与えられた数字が1または2の場合は1桁であるため、1の場合は4、2の場合は7となる.
  • の2桁が配列に順番に配置された後、入力された数字が2より大きく、6以下である場合、入力された数字から2を減算し、mと呼ぶと、2桁からmが出力される.
  • どちらも当てはまらない場合は、桁数が1回増加するごとに2倍になるという事実を使用して、検索する桁数を決定します.入力した数値から数を減算し、検索する数値の桁数の数を決定します.
  • 桁のうち、前半前列が4、後半前列が7で、前半が7であれば、前半が7桁の中で何番目であるかを知るために、その桁の半分を減算します.
  • ステップ
  • 4を2桁まで1桁減らします.
  • を減らし、前桁を求める場合、残りが2桁であれば、予め順番に保存しておいた2桁配列を用いて、現在の整数の後ろに貼り付ける.こうして一手を救った