import org.junit.Test;
import java.math.BigInteger;
import java.util.*;
/**
* @author guochao
* @date 2022/4/9
*/
public class Main {
static BigInteger resInteger = new BigInteger("0");
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
for (int i = 1; i <= num; i++) {
Set<BigInteger> hashset = new HashSet<>();
for (int j = 1; j <= i; j++) {
BigInteger thisinteger = new BigInteger(j+"");
BigInteger maxint = new BigInteger(i+"");
if(new BigInteger("0").compareTo(maxint.mod(thisinteger)) == 0){
hashset.add(new BigInteger(j+""));
}
}
for (BigInteger integer :hashset) {
BigInteger temp = integer.multiply(integer);
resInteger = resInteger.add(temp);
}
}
BigInteger bigInteger = new BigInteger("1000000007");
System.out.println(resInteger.mod(bigInteger));
}
@Test
public void test(){
BigInteger bigInteger1 = new BigInteger(String.valueOf(1));
BigInteger bigInteger2 = new BigInteger("100000000000");
BigInteger bigInteger3 = new BigInteger(String.valueOf(0));
System.out.println(bigInteger1.add(bigInteger2));
System.out.println(bigInteger2.multiply(bigInteger2));
System.out.println(bigInteger3.add(bigInteger2));
System.out.println(resInteger.add(bigInteger2));
System.out.println(resInteger.add(bigInteger1));
}
}
详细使用:
借鉴文章:
https://www.cnblogs.com/zumengjie/p/13815851.html.
BigInteger
BigInteger的作用是对整数做计算,一般的使用String类型初始化BigInteger。
两个BigInteger的结果可以通过终止函数获取结果,例如intValue()将结果转换位int值,但是这里需要注意,如果结果已经超过了目标结果类型的精度则会不准确,最好的方式是通过.toString()函数获取一个字符串的值
public static void main(String[] args) {
// int最大值 2147483647
System.out.println(Integer.MAX_VALUE);
// long最大值 9223372036854775807
System.out.println(Long.MAX_VALUE);
BigInteger bigInteger1 = new BigInteger("9223372036854775807");
BigInteger bigInteger2 = new BigInteger("9223372036854775807");
// 两个数相乘
BigInteger value12 = bigInteger1.multiply(bigInteger2);
// 直接获取Long结果是错误的,因为已经超过了Long的最大精度
// long longValue = value12.longValue();
// 获取字符串可以
String svalue12 = value12.toString();
// 85070591730234615847396907784232501249
System.out.println(svalue12);
// 在将相乘的结果/9223372036854775807
BigInteger bigInteger3 = new BigInteger(svalue12);
BigInteger bigInteger4 = new BigInteger("9223372036854775807");
// 两个数相除
BigInteger bigInteger34 = bigInteger3.divide(bigInteger4);
// 这个结果是没有超过Long的精度
long lbigInteger34 = bigInteger34.longValue();
// 9223372036854775807
System.out.println(lbigInteger34);
BigInteger bigInteger5 = new BigInteger("1");
BigInteger bigInteger6 = new BigInteger("1");
// 两个数相加
BigInteger bigInteger56 = bigInteger5.add(bigInteger6);
System.out.println(bigInteger56.byteValue());//2
BigInteger bigInteger7 = new BigInteger("2");
BigInteger bigInteger8 = new BigInteger("1");
// 两个数相减
BigInteger bigInteger78 = bigInteger7.subtract(bigInteger8);
System.out.println(bigInteger78.byteValue());//1
// 错误的,它不支持小数
// BigInteger bigInteger9 = new BigInteger("1.2");
}
BigDecimal
public static void main(String[] args) {
Long max_long = Long.MAX_VALUE;
System.out.println(max_long);//9223372036854775807
BigInteger bigInteger = new BigInteger(max_long + "");
// 你可以使用一个BigInteger实例化BigDecimal
BigDecimal bigDecimal1 = new BigDecimal(bigInteger);
BigDecimal bigDecimal2 = new BigDecimal(bigInteger);
// 除法运算
BigDecimal bigDecimal12 = bigDecimal1.divide(bigDecimal2);
System.out.println(bigDecimal12.intValue());//1
// 使用字符串实例化BigDecimal做加法运算
BigDecimal bigDecimal3 = new BigDecimal("1");
BigDecimal bigDecimal4 = new BigDecimal("1");
BigDecimal bigDecimal34 = bigDecimal3.add(bigDecimal4);
System.out.println(bigDecimal34.intValue());//2
// 使用字符串实例化BigDecimal做减法运算
BigDecimal bigDecimal5 = new BigDecimal("5");
BigDecimal bigDecimal6 = new BigDecimal("3");
BigDecimal bigDecimal56 = bigDecimal5.subtract(bigDecimal6);
System.out.println(bigDecimal56.intValue());//2
// 使用字符串实例化BigDecimal做乘法运算
BigDecimal bigDecimal7 = new BigDecimal("3");
BigDecimal bigDecimal8 = new BigDecimal("4");
BigDecimal bigDecimal78 = bigDecimal7.multiply(bigDecimal8);
System.out.println(bigDecimal78.intValue());//12
// 对小数做操作,这个加法运算的结果是 7.9888
BigDecimal bigDecimal9 = new BigDecimal("3.1");
BigDecimal bigDecimal10 = new BigDecimal("4.8888");
BigDecimal bigDecimal910 = bigDecimal9.add(bigDecimal10);
System.out.println(bigDecimal910);//7.9888
BigDecimal bigDecimala1 = new BigDecimal("3.1");
BigDecimal bigDecimala2 = new BigDecimal("4.8888");
BigDecimal bigDecimala12 = bigDecimala1.add(bigDecimala2);
// 对一个BigDecimal的结果进行小数舍入,以下是保留小数点后3位,多余的四舍五入 7.989
BigDecimal sbigDecimala12 = bigDecimala12.setScale(3, BigDecimal.ROUND_HALF_UP);
System.out.println(sbigDecimala12.toString());//7.989
//减法
System.out.println(bigDecimala1.subtract(bigDecimala2));//-1.7888
//乘法
System.out.println(bigDecimala1.multiply(bigDecimala2));//15.15528 结果的小数位数为两数的小数位数相加
//除法 六位小数,四舍五入
System.out.println(bigDecimala2.divide(bigDecimala1, 6, BigDecimal.ROUND_HALF_UP));//1.577032
}
注意使用bigdecimal做除法的时候:当结果除不进,并且没有设置进位的状态值,那就会抛出异常。
正确如下:
//除法 六位小数,四舍五入
bigDecimala2.divide(bigDecimala1, 6, BigDecimal.ROUND_HALF_UP);//1.577032
总结:当我们在精度要求非常高的时候,需要进行精确的计算,比如:货币,那我们就需要采用 java.math.BigDecimal 类来进行精确计算。