魔法数字计算 | 豆包MarsCode AI刷题

166 阅读3分钟

小 W 拥有一项魔法,可以对任意数字字符串进行加一的操作,比如当他拿到 “798” 这样的数字字符串,每一次操作,他会将其中每一个字符进行加一,比如经过一次操作后得到了 “8109”。他想知道操作 k 次后,这个数字将会变成多少,由于答案可能很大,最终结果需要对 1000000007 取模 import java.math.BigInteger; import java.util.LinkedList; public class Main { public static int solution(int n, int k, String numStr) { LinkedList list = new LinkedList<>(); for (char word : numStr.toCharArray()) { int num = word - '0'; list.add(num); } // 使用内置方法反转链表 java.util.Collections.reverse(list); // 逐位加一 for(int j=0;j<k;j++){ for (int i = 0; i < list.size(); i++) { int value = list.get(i) + 1; if (value <= 9) { list.set(i, value); } else if (value == 10) { list.set(i, 0); list.add(i + 1, 1); i++; } } } // 再次反转回来 java.util.Collections.reverse(list); // 构建 BigInteger 对象 StringBuilder sb = new StringBuilder(); for (Integer num : list) { sb.append(num); } BigInteger number = new BigInteger(sb.toString()); BigInteger text = new BigInteger("1000000007"); // System.out.println(number.remainder(text).toString()); //
//检查转换后数据的类型 // System.out.println(number.remainder(text).toString().getClass()); return number.remainder(text).intValue(); } public static void main(String[] args) { int result1 = solution(3, 1, "798"); System.out.println(result1 == 8109); int result2 = solution(4, 1, "8109"); System.out.println(result2 == 92110); int result3 = solution(5, 1, "92110"); System.out.println(result3 == 103221); } } 模运算是一种数学运算,它涉及到整数除法的余数。当我们对两个整数进行模运算时,我们实际上是在寻找第一个数除以第二个数后剩下的余数。在数学上,如果我们有两个整数 ( a ) 和 ( n ),( a ) 模 ( n )(记作 ( a \mod n ))的结果是 ( a ) 除以 ( n ) 后得到的余数。

模运算有几个重要的性质和应用:

  1. 周期性:模运算结果的范围是从 0 到 ( n-1 )。这意味着任何整数 ( a ) 模 ( n ) 的结果都会在这个范围内,形成一个周期性的行为。

  2. 等价关系:如果两个整数 ( a ) 和 ( b ) 模 ( n ) 的结果相同,即 ( a \equiv b \mod n ),那么我们就说 ( a ) 和 ( b ) 在模 ( n ) 下是等价的。

  3. 加法和乘法的封闭性:对于任何整数 ( a )、( b ) 和 ( n ),( (a + b) \mod n ) 和 ( (a \times b) \mod n ) 的结果仍然是整数,并且分别等于 ( a ) 和 ( b ) 各自模 ( n ) 的结果相加或相乘后再模 ( n )。

  4. 简化问题:在处理大数问题时,模运算可以用来简化问题,避免直接处理大数。例如,在密码学中,模运算用于简化大数的乘法和指数运算。

  5. 同余方程:模运算是解决同余方程的基础,同余方程是一类特殊的方程,其中未知数的解必须满足特定的模条件。

  6. 算法优化:在算法设计中,模运算可以用来减少计算量,特别是在涉及到大数运算时,通过模一个较小的数来避免整数溢出。

  7. 数论基础:模运算是数论中的一个基本概念,与素数、最大公约数、最小公倍数等概念紧密相关。

在你提到的问题中,模运算的作用是为了防止数字过大而导致计算上的困难或溢出。通过在每一步操作中都对结果进行模 1000000007 的运算,我们可以确保结果始终保持在一个可控的范围内,同时保持计算的正确性。这是因为模运算具有加法和乘法的封闭性,即 ( (a + b) \mod n = ((a \mod n) + (b \mod n)) \mod n ) 和 ( (a \times b) \mod n = ((a \mod n) \times (b \mod n)) \mod n )。这意味着我们可以在每一步都进行模运算,而不影响最终结果的正确性。