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); } } }