题目描述
对于一个五位数a1a2a3a4a5,可将其拆分为三个子数:
例如,五位数20207可以拆分成
sub1=202
sub2=020(=20)
sub3=207
现在给定一个正整数K,要求你编程求出10000到30000之间所有满足下述条件的五位数,条件是这些五位数的三个子数sub1,sub2,sub3都可被K整除。
输入格式
一个正整数K
输出格式
每一行为一个满足条件的五位数,要求从小到大输出。不得重复输出或遗漏。如果无解,则输出“No”。
输入输出样例
输入
15
输出
22555
25555
28555
30000
解析思路
本题为拆分整数并合并的题型,可以根据以下步骤编写算法程序。
①对整数K进行拆分。由于K是5位整数,故我们可以用以下方法将其分解
arr[0] = (i / 10000); //万
arr[1] = (i % 10000) / 1000; //千
arr[2] = (i % 1000) / 100; //百
arr[3] = (i % 100) / 10; //十
arr[4] = i % 10; //个
②每3位相和并,得出sub1,sub2,sub3 。
int i1 = arr[0];
int i2 = arr[1];
int i3 = arr[2];
int i4 = arr[3];
int i5 = arr[4];
int sub1 = i1 * 100 + i2 * 10 + i3;
int sub2 = i2 * 100 + i3 * 10 + i4;
int sub3 = i3 * 100 + i4 * 10 + i5;
③条件判断:sub1,sub2,sub3都可被K整除
boolean t = sub1 % k == 0 && sub2 % k == 0 && sub3 % k == 0;
完整代码如下:
package com.luogu;
import java.util.Scanner;
public class P1151 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt();
int[] arr = new int[5];
boolean flag = false;
for (int i = 10000; i <= 30000; i++) {
arr[0] = (i / 10000); //万
arr[1] = (i % 10000) / 1000; //千
arr[2] = (i % 1000) / 100; //百
arr[3] = (i % 100) / 10; //十
arr[4] = i % 10; //个
int i1 = arr[0];
int i2 = arr[1];
int i3 = arr[2];
int i4 = arr[3];
int i5 = arr[4];
int sub1 = i1 * 100 + i2 * 10 + i3;
int sub2 = i2 * 100 + i3 * 10 + i4;
int sub3 = i3 * 100 + i4 * 10 + i5;
if (sub1 % k == 0 && sub2 % k == 0 && sub3 % k == 0) {
flag = true;
System.out.println(i);
}
}
if (!flag) {
System.out.println("No");
}
}
}