大数取模
- 蓝桥杯中经常会让运算结果对某一个很大的数取模作为最终结果。而往往运算结果本身就是一个十分巨大的数。这时不能把运算结果直接对这个很大的数取模。实际上运算结果在程序中是多次加法得到的,只需要在每次得到部分结果时就对其进行取模运算。再相加就得到最终结果。
例如:
27/7=3...6 (27=17+10)
17/7=2...3
10/7=1...3
可见,3=(2+1);6=(3+3)
大数开平方
- 大数直接开平方很难,有定理为:
- 假设位数为len的整数,开方取整后为一个lenSqrt位数。
- 当len为偶数,lenSqrt = len / 2 .
- 当len为奇数,lenSqrt = (len / 2) + 1 .
- 然后利用循环,从高位到地位,逐位确定其值。具体如下:
for(int pos=0;pos<len;pos++) {
for(char c='1';c<='9';c++) {
sarr[pos]=c;
BigInteger pow=new BigInteger(String.valueOf(sarr)).pow(2);
if(pow.compareTo(target)==1) {
sarr[pos]-=1;
break;
}
}