結果

問題 No.207 世界のなんとか
ユーザー velfare_nagatavelfare_nagata
提出日時 2016-10-04 20:18:59
言語 Java21
(openjdk 21)
結果
TLE  
実行時間 -
コード長 2,038 bytes
コンパイル時間 4,065 ms
コンパイル使用メモリ 79,680 KB
実行使用メモリ 111,192 KB
最終ジャッジ日時 2024-11-21 16:47:35
合計ジャッジ時間 59,958 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 TLE -
testcase_02 TLE -
testcase_03 TLE -
testcase_04 TLE -
testcase_05 TLE -
testcase_06 AC 145 ms
110,548 KB
testcase_07 AC 115 ms
54,784 KB
testcase_08 AC 126 ms
54,180 KB
testcase_09 AC 133 ms
54,012 KB
testcase_10 WA -
testcase_11 AC 133 ms
54,220 KB
testcase_12 WA -
testcase_13 WA -
testcase_14 TLE -
testcase_15 TLE -
testcase_16 AC 126 ms
53,892 KB
testcase_17 AC 128 ms
54,008 KB
testcase_18 AC 129 ms
111,192 KB
権限があれば一括ダウンロードができます

ソースコード

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