結果

問題 No.207 世界のなんとか
ユーザー velfare_nagatavelfare_nagata
提出日時 2016-10-04 20:18:59
言語 Java21
(openjdk 21)
結果
TLE  
実行時間 -
コード長 2,038 bytes
コンパイル時間 4,756 ms
コンパイル使用メモリ 81,952 KB
実行使用メモリ 70,612 KB
最終ジャッジ日時 2024-05-01 12:25:58
合計ジャッジ時間 16,282 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 -- -
testcase_02 -- -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

package yukicoder;

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

public class Answer {

	/**
	 * A以上B以下の整数のうち、3の倍数および3の付く数を、小さい順に出力してください。
	 *
	 * なお、「3の付く数」とは、10進数表記にした時、少なくとも1つの桁が3であるような数のことです。
	 */
	public static void main(String[] args) {
		// パラメータ取得
		 Scanner sc = new Scanner(System.in);
		 int a = sc.nextInt();
		 int b = sc.nextInt();
		 sc.close();
/*
		int a = 0;
		int b = 100;

*/		// 引数の桁数取得
		int digitA = 0;
		for (int i = a; i > 0; i /= 10)
			digitA++;
		int digitB = 0;
		for (int i = b; i > 0; i /= 10)
			digitB++;

		// 有効範囲内の3のつく数と3の倍数を管理するテーブルを作成する
		ArrayList<Integer> numsWithThree = new ArrayList<Integer>();

		// 3のつく数を管理
		for (int i = 0; i < digitB; i++) {
			int upperDigit = digitB - i;
			int upperDigitFlag = 1;
			for (int j = 0; j < upperDigit - 1; j++)
				upperDigitFlag *= 10;
			int lowerDigit = i;
			int lowerDigitFlag = 1;
			for (int k = 0; k < lowerDigit; k++)
				lowerDigitFlag *= 10;

			int upperStart = a / (lowerDigitFlag * 10);
			int upperEnd = b / (lowerDigitFlag * 10);
			if (upperDigitFlag == 1) {
				upperStart = 0;
				upperEnd = 1;
			}

			int lowerEnd = lowerDigitFlag;
			for (int upper = upperStart; upper < upperEnd; upper++) {
				for (int lower = 0; lower < lowerEnd; lower++) {
					int target = ((upper * (lowerDigitFlag * 10)) + (3 * lowerDigitFlag) + lower);
					if( target > b)
						break;
					if (!numsWithThree.contains(target))
						numsWithThree.add(target);
				}
			}
		}
		// 3の倍数を管理
		for (int i = 3 * (a / 3) + 3; i <= 3 * (b / 3); i += 3)
			if (!numsWithThree.contains(i))
				numsWithThree.add(i);

		// ソートして全部出力
		Collections.sort(numsWithThree);
		for(int num : numsWithThree) {
			System.out.println(num);
		}
	}
}
0