小 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 ) 后得到的余数。
模运算有几个重要的性质和应用:
-
周期性:模运算结果的范围是从 0 到 ( n-1 )。这意味着任何整数 ( a ) 模 ( n ) 的结果都会在这个范围内,形成一个周期性的行为。
-
等价关系:如果两个整数 ( a ) 和 ( b ) 模 ( n ) 的结果相同,即 ( a \equiv b \mod n ),那么我们就说 ( a ) 和 ( b ) 在模 ( n ) 下是等价的。
-
加法和乘法的封闭性:对于任何整数 ( a )、( b ) 和 ( n ),( (a + b) \mod n ) 和 ( (a \times b) \mod n ) 的结果仍然是整数,并且分别等于 ( a ) 和 ( b ) 各自模 ( n ) 的结果相加或相乘后再模 ( n )。
-
简化问题:在处理大数问题时,模运算可以用来简化问题,避免直接处理大数。例如,在密码学中,模运算用于简化大数的乘法和指数运算。
-
同余方程:模运算是解决同余方程的基础,同余方程是一类特殊的方程,其中未知数的解必须满足特定的模条件。
-
算法优化:在算法设计中,模运算可以用来减少计算量,特别是在涉及到大数运算时,通过模一个较小的数来避免整数溢出。
-
数论基础:模运算是数论中的一个基本概念,与素数、最大公约数、最小公倍数等概念紧密相关。
在你提到的问题中,模运算的作用是为了防止数字过大而导致计算上的困难或溢出。通过在每一步操作中都对结果进行模 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 )。这意味着我们可以在每一步都进行模运算,而不影响最终结果的正确性。