问题描述
在一个古老的迷宫中,有一道无尽的通道。通道上每隔一定的距离就会有一块神秘的石头,石头上刻着从 1 开始的连续整数。从 1 号石头开始,每块石头的编号都比前一块大 1。
石头上的数字有特殊的意义。如果你站在编号为 n 的石头上,并向前走,你将会瞬间移动到编号为 n+x 的石头上,其中 x 为 n 的各位数字之和。
例如,如果你站在编号为 16 的石头上,由于 1+6=7,所以下一步你会移动到编号为 16+7=23 的石头上。
现在,会有多次询问,你需要对每个询问输出从 1 号石头出发,到达指定编号石头的最少步数,如果无法到达,则输出 −1。
输入格式
输入包含一个整数 t,(1≤t≤100),表示有 t 个询问。
接下来 t 行,每行一个整数 n,(1≤n≤10^6),表示目标石头的编号。
输出格式
对于每个询问,输出一行,表示从 1 号石头到达目标石头的最少步数。如果无法到达,输出 −1。
输入样例
4
8
15
23
1000000
输出样例
3
-1
5
-1
代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //实例个数
int[] array = new int[n];
for (int i = 0; i < n; i++) {
array[i] = sc.nextInt();
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
int sum = 1;
int count = 0;
while (sum <= array[i]){
count++;
sum += sum(sum);
if (sum == array[i]) {
list.add(count);
break;
}
if (sum > array[i]) {
list.add(-1);
break;
}
}
}
for (int x : list)
System.out.println(x);
}
public static int sum(int m){ //求m数位之和
int sum = 0;
String str = m + "";
char[] arr = str.toCharArray();
for (int i = 0; i < arr.length; i++) {
int num = arr[i] - '0';
sum += num;
}
return sum;
}
}