题目
在Temmie的世界中,有一种特殊的运算X,它的运算方式如下:
对于一个整数n,对它的每一位d,用d+1替换d。
例如,对于193,它的每一位+1后的结果为2,10,4。所以,193的X运算结果为2104。
现在小Temmie想要把整数n进行m次X运算后的结果写在纸上,可是他不知道这个结果需要用多少张纸,所以,他来拜托你计算n进行m次运算后结果的位数。
因为结果可能超过整形范围,所以你只需要告诉他结果模 10^9+7 的余数即可。
输入格式
第一行一个数字t,代表有t个测试用例。(1<=t<=2*10^5)
接下来t行,每行两个数字,分别代表n和m。(1<=n<=10^9, 1<=m<=2*10^5)
输出格式
t行,每行1个整数,表示对n进行m次运算X后得到的结果的位数模10^9+7的余数。
样例输入
5
1912 1
5 6
999 1
88 2
12 100
样例输出
5
2
6
4
2115
样例解释
对于第一个样例,1912进行一次X运算后得到的结果为21023,长度为5位。
对于第二个样例,5进行6次X运算后得到的结果为21,长度为2位。
对于第三个样例,999进行1次X运算后得到的结果为101010,长度为6。
对于第四个样例,88进行2次X运算后的结果为1010,长度为4。
解析
-
使用输入对象 Scanner sc = new Scanner(System.in) ,进行输入值。 -
先输入 t 行的值,然后以此为数组的大小创建 n 和 m ,然后进行输入值。 注意:需要对 t、m 和 n 进行界限判断。 -
对传进来的整数进行 X 运算,即对每一位进行加1 3.1 利用String中的分割函数可以轻松的取出数字每位上的数 3.2 然后将每位上的数加 1 后,进行长度判断 -
因为是对传进来的整数不止一次的进行 X 运算,故采用 递归的方法进行 m 次的 X 运算 注意:这里进行递归传进来的 n 值有可能超过界限范围,故需要判断抛出。 -
输出对 n 值的 m 次 X 运算后返回数值的长度
代码实现
import java.util.Scanner;
public class Temmie {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
if (t < 1 || t > 2 * 1e5) {
System.out.println("你输入t的值不合法,请重新输入合法的值(1<=t<=2*10^5):");
t = sc.nextInt();
}
int[] n = new int[t];
int[] m = new int[t];
for (int i = 0; i < t; i++) {
n[i] = sc.nextInt();
m[i] = sc.nextInt();
if (n[i] < 1 || n[i] > 1e9 || m[i] < 1 || m[i] > 2 * 1e5) {
System.out.println("你输入的值不合法,请重新输入合法的值 n m(1<=n<=10^9, 1<=m<=2*10^5):");
n[i] = sc.nextInt();
m[i] = sc.nextInt();
}
}
for (int i = 0; i <t ; i++) {
System.out.println(getlength(t,n,m)[i]);
}
}
public static int[] getlength(int t, int[] n, int[] m) {
int[] length = new int[t];
int[] num=new int[t];
for (int i = 0; i < t; i++) {
num[i] =getOneLength(n[i],m[i]);
length[i] = String.valueOf(num[i]).length();
}
return length;
}
public static int getOneLength(int n, int m) {
int num=0;
String[] strings = String.valueOf(n).split("");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < strings.length; i++) {
int x = Integer.parseInt(strings[i]);
if (x == 9) {
sb.append(1).append(0);
} else {
sb.append(x + 1);
}
}
if (sb.length()>10){
throw new NumberFormatException("n="+sb.toString()+"的数值过大,无法求解");
}
num = Integer.parseInt(sb.toString().trim());
m--;
if (m>0){
num=getOneLength(num, m);
}
return num;
}
}
结果截图
数值异常截图
12 100 这组数因为递归后,传进的n值超过界限,故抛出异常
这组数因时间和知识有限,没有处理好,若您有好的方法处理,请评论区告知,谢谢
|