大数取余
一般大多数情况下,我们都能直接使用%号进行取余操作,但是当出现了一个巨大的数字,即使是long long也不能正确装下的数字我们要怎么办?这种数很明显只能使用数组来装,那我们要怎么样从数组中求出这个余数?
不仅仅是大数可以使用这种思想,这种思想是通用的,为了方便,我们这里使用小数进行示例。
现在假设我们求解433%3,下面是大致的过程
图中就是的算法过程其实就是我们简单的除法过程,可以看出,最后所剩下的余数其实就是我们想要的余数。
所以说这个算法的核心思想其实就是一个除法的过程,首先从高位开始一位一位的进行运算,把每一位留下的余数乘10(为什么要乘10?因为上一位的余数相当于这一位来说是一个10倍的关系,其实从上面图中也可以看出)添加到下一位去,直到最后一位进行除运算之后。
简单的描述一下计算的过程
第一位数字4:
4%3=1
第二位数字4:要将上一位留下来的余数加到这一位上,所以有了(1X10)
(1×10+4)%3=2
第三位数字3:依然是将上一位的余数2加到这一位上,所以有了(2X10)
(2×10+3)%3=2(2×10+3)%3=2
最终的结果是最后一步计算得到的余数2。
下面看代码:
/**
* 大数取余算法
*/
public static int BigNumMod(char BigNum[], int c, int length){
int ans = 0;
for(int i = 0; i < length; i++){
ans = ((ans * 10) + BigNum[i]-'0') % c;
}
return ans;
}
总结:核心思想与我们日常算除法的过程几乎一致
部分引用自:https://blog.csdn.net/qq_32779119/article/details/79513480