java--两个巨⼤素数(质数)的乘积
得到两个巨⼤素数(质数)的乘积是简单的事,但想从该乘积分解出这两个巨⼤素数却是国际数学界公认的质因数分解难题。这种单向的数学关系,是不对称加密RSA算法的基本原理。 本题给出两个⼤素数(128bit位)的乘积和其中⼀个素数,请你编程求出另⼀个素数。
输⼊格式:
44022510695404470886511586569647292146578314354528108825807522926455663589709 (⼤素数的乘积)189193782774204832019945226750213439577 (其中⼀个⼤素数)
输出格式:
java源代码加密232684764001698545563067004009755869717 (另⼀个素数)
输⼊样例:
608836658781298589359189583330915304207460546224057376306137776 84610994823161 271963475875372143777333694041058521413
输出样例:
223867067745633357281812540202957589797
分析:
要存储的数字为128bit 基本类型中 double 64bit long 64bit都不满⾜要求,使⽤BigDecimal 128bit 存储,精度⽐float double 要⾼。读取java.math.BigDecimal。的JDK源码发现
BigDecimal⼀共有4个构造⽅法,先看其中两种⽤法:
第⼀种:BigDecimal(double val)
Translates a double into a BigDecimal.
第⼆种:BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
使⽤BigDecimal要⽤String来够造,要做⼀个加法运算,需要先将两个浮点数
转为String,然后够造成BigDecimal,在其中⼀个上调⽤add⽅法,
传⼊另⼀个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。
其加减乘除运算如下:
BigDecimal bignum1 = new BigDecimal("10");
BigDecimal bignum2 = new BigDecimal("5");
BigDecimal bignum3 = null;
/加法
bignum3 =  bignum1.add(bignum2);
//减法
bignum3 = bignum1.subtract(bignum2);
//乘法
bignum3 = bignum1.multiply(bignum2);
//除法
bignum3 = bignum1.divide(bignum2);
注意:
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
第⼀参数表⽰除数, 第⼆个参数表⽰⼩数点后保留位数,第三个参数表⽰舍⼊模式,只有在作除法运算或四舍五⼊时才⽤到舍⼊模式。建议在divide⽅法中传递第⼆个参数,定义精确到⼩数点后⼏位,否则在不整除的情况下,结果是⽆限循环⼩数时,就会抛出异常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result
代码如下:
//decimal:数字型,128bit
//60883665878129858935918958333091530420746054622405737630613777684610994823161
//271963475875372143777333694041058521413
import java.math.BigDecimal;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
BigDecimal mp = sc.nextBigDecimal();
BigDecimal a = sc.nextBigDecimal();
System.out.println(mp.divide(a));
}
}