一个整数n,对它的每一位d,用d+1替换d的编程题

题目

有一种特殊的运算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。

解析

  1. 使用输入对象 Scanner sc = new Scanner(System.in),进行输入值。

  2. 先输入 t 行的值,然后以此为数组的大小创建 n 和 m ,然后进行输入值。

    注意:需要对 t、m 和 n 进行界限判断。

  3. 对传进来的整数进行 X 运算,即对每一位进行加1

    3.1 利用String中的分割函数可以轻松的取出数字每位上的数

    3.2 然后将每位上的数加 1 后,进行长度判断

  4. 因为是对传进来的整数不止一次的进行 X 运算,故采用 递归的方法进行 m 次的 X 运算

    注意:这里进行递归传进来的 n 值有可能超过界限范围,故需要判断抛出。

  5. 输出对 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;
    }
}

结果截图

image-20210913222613661

数值异常截图

image-20210913222643625

12 100 这组数因为递归后,传进的n值超过界限,故抛出异常

这组数因时间和知识有限,没有处理好,若您有好的方法处理,请评论区告知,谢谢

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江七7

感谢大佬的赏赐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值