题目
有一种特殊的运算X,它的运算方式如下:
对于一个整数n,对它的每一位d,用d+1替换d。
例如,对于193,它的每一位+1后的结果为2,10,4。所以,193的X运算结果为2104。
因为结果可能超过整形范围,所以结果模 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;
/**
* @author 江七
* @version 1.0
* @date 2021/9/13 16:43
*/
public class Temmie {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();//代表有t个测试用例
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++) {//1<=n<=10^9, 1<=m<=2*10^5
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("n="+n[i]+",m="+m[i]+"经运算后的长度为:"+getlength(t,n,m)[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]);//将字符串转化成int
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值超过界限,故抛出异常
这组数因时间和知识有限,没有处理好,若您有好的方法处理,请评论区告知,谢谢