概述
java中大数运算非常方便
但要记住一些函数
java中的数学函数要加前缀(相较与c++):Math.
java多组输入:
Scanner in =new Scanner(System.in);
while(in.hasNext()) {//多组输入
//
}
首先是 头文件:import java.math.BigInteger;
BigInteger a =in.nextBigInteger(); 定义一个大数a,并且输入
1.a.add(b); a+b
2.a.subtract(b); a-b
3.a.multiply(b); a*b
4.a.divide(b); a/b
5.a.remainder(b); a%b
6.a.gcd(b); gad(a,b)
7.a!
8.cc.compareTo(dd); 返回int类型(1为>,0为=,-1为<)
BigInteger m;
m =BigInteger.valueOf(1);//BigInteger.valueOf();为定义一个已知大数.
int x;
x=in.nextInt();
for(int j=1;j<=x;j++)
{
m=m.multiply(BigInteger.valueOf(j));
}
System.out.println(m);
完整代码:
import java.util.Scanner;
import java.math.BigInteger;
public class Largenumber {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in =new Scanner(System.in);
System.out.println("输入两个大数:");
BigInteger a =in.nextBigInteger();
BigInteger b =in.nextBigInteger();
System.out.println("输入操作n1.加法n2.减法n3.乘法n4.除法n5.取余n6.最大公约数n7.求阶乘");
int n=in.nextInt();
System.out.println("result:");
if(n==1)
{
System.out.println(a.add(b)); ///a+b
}
else if(n==2)
{
System.out.println(a.subtract(b)); ///
}
else if(n==3)
{
System.out.println(a.multiply(b)); ///a*b
}
else if(n==4)
{
System.out.println(a.divide(b)); ///a/b
}
else if(n==5)
{
System.out.println(a.remainder(b)); ///a%b
}
else if(n==6)
{
System.out.println(a.gcd(b)); ///gcd(a,b)
}
else ///a!
{
BigInteger m;
m =BigInteger.valueOf(1);//BigInteger.valueOf();为定义一个已知大数.
int x;
x=in.nextInt();
for(int j=1;j<=x;j++)
{
m=m.multiply(BigInteger.valueOf(j));
}
System.out.println(m);
}
}
}
BigDecimal
加:add(BigDecima)
减:subtract(BigDecimal)
乘:multiply(BigDecimal)
除:divide(BigDecimal)
乘方:pow(int)
取绝对值:abs()
取反:negate()
对比:compareTo(BigDecimal)
设置小数点精确度:setScale(int)
设置保留小数点精确度并添加保留方式(直接加1或者四舍五入):setScale(int, int)
1、ROUND_UP
舍入远离零的舍入模式。
在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。
2、ROUND_DOWN
接近零的舍入模式。
在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
注意,此舍入模式始终不会增加计算值的大小。
3、ROUND_CEILING
接近正无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
如果为负,则舍入行为与 ROUND_DOWN 相同。
注意,此舍入模式始终不会减少计算值。
4、ROUND_FLOOR
接近负无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
如果为负,则舍入行为与 ROUND_UP 相同。
注意,此舍入模式始终不会增加计算值。
5、ROUND_HALF_UP
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
6、ROUND_HALF_DOWN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
7、ROUND_HALF_EVEN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。
以下例子为保留小数点1位,那么这种舍入方式下的结果。
1.15>1.2 1.25>1.2
8、ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
-----------------------------------------------------------------------
a.setScale(2,BigDecimal.ROUND_HALF_UP ) //a保留两位小数
package abigDecimal;
import java.util.Scanner;
import java.math.BigDecimal;
public class test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in=new Scanner(System.in);
BigDecimal a,c;
int flag=0;
a=in.nextBigDecimal();
c=new BigDecimal("0");
if(a.compareTo(c)<0)
{
flag=1;
}
if(flag==1){
System.out.print("(");
}
a=a.abs();
System.out.print(a.setScale(2,BigDecimal.ROUND_HALF_UP ));
if(flag==1){
System.out.print(")n");
}
}
}
Strassen
题意:
在本题中,我们只有两种方法计算两个n×n的矩阵的乘积,第一种为定义法,需要n3次乘法和(n−1)n2次加法。第二种为Strassen分治法,仅当n为偶数时可以使用,需要18(n/2)2次加法以及再计算7次大小为(n/2)×(n/2)的矩阵的乘积。这7次更小矩阵的乘积也可以选择两种方法之一计算。现假设计算机计算一次加法需要a单位时间,计算一次乘法需要b单位时间,其他任何操作不花费时间,问计算两个n×n的矩阵的乘积至少需要多少时间。输出答案模109+7的余数。
解析:
我直接用java大数处理
ac:
import java.math.BigInteger;
import java.util.Scanner;
public class Main{
static BigInteger dfs(BigInteger n,BigInteger a,BigInteger b)
{
if(n.equals(BigInteger.valueOf(1)))
{
return b;
}
BigInteger ans=BigInteger.valueOf(0),res=BigInteger.valueOf(0);
BigInteger aa=n.pow(3);
aa=aa.multiply(b);
BigInteger bb=n.pow(2);
bb=bb.multiply(n.subtract(BigInteger.valueOf(1)));
bb=bb.multiply(a);
ans=aa.add(bb);
if(n.mod(BigInteger.valueOf(2)).equals(BigInteger.valueOf(0))) {
BigInteger k=n.divide(BigInteger.valueOf(2));//n/2
res=k.pow(2);
res=res.multiply(BigInteger.valueOf(18).multiply(a));
res=res.add(BigInteger.valueOf(7).multiply(dfs(k,a,b)));
if(res.compareTo(ans)<0)
ans=res;
}
return ans;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int t;
BigInteger n,a,b;
t=in.nextInt();
BigInteger gg=BigInteger.valueOf(1000000007);
while(t!=0)
{
n=in.nextBigInteger();
a=in.nextBigInteger();
b=in.nextBigInteger();
BigInteger kk=dfs(n,a,b);
System.out.println(kk.mod(gg));
t--;
}
}
}
http://codeforces.com/gym/102028/problem/E
题意:
RR=1/(1/R1+1/R2+1/R3+....+1/Rn)
Ri=i,如果i的因子有一个数的二次,Ri就为无穷大
Si={j,i%j==0},Si包含i的所以因子
解析:
为了让RR竟可能的小,呢就就让1/R1+1/R2+....+1/R2,尽可能的大,竟可能的多
=>Ri越小越好,然后Ri的集合有是一个数的因子,呢么如果Ri与Rj相等,呢么Ri*Rj为d^2,无穷大,倒一下->0,白白多加一个因子
再根据测试数据,很容易退出10->1,2,3 选择连续素数的积<=n
1/(1/1+1/2+1/3)=1/2
这里n非常大,用java过
ac:
import javafx.scene.transform.Scale;
import org.omg.Messaging.SYNC_WITH_TRANSPORT;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
int prime[]=new int[1005],k=1;
prime[1]=1;
for(int a=2;a<=500;a++){
int sign=0;
for(int b=2;b*b<=a;b++){
if(a%b==0){
sign=1;
break;
}
}
if(sign==0){
prime[++k]=a;
}
}
Scanner in=new Scanner(System.in);
int t;
t=in.nextInt();
while(t!=0)
{
BigInteger AA,BB,c,EE,DD;
BB= BigInteger.valueOf(1);
AA=in.nextBigInteger();
EE=BigInteger.valueOf(1);
DD=BigInteger.valueOf(1);
for(int i=2;i<=k;i++)
{
c=BigInteger.valueOf(prime[i]);
BB = BB.multiply(c);
if(BB.compareTo(AA)==1){
break;
}
EE=EE.multiply(c.add(BigInteger.valueOf(1)));
DD=BB;
}
BigInteger gcc=EE.gcd(DD);
System.out.println(DD.divide(gcc)+"/"+EE.divide(gcc));
t--;
}
}
}
https://vjudge.net/problem/POJ-3101
题意:
n个行星开始在一条直线上且在同一边,问你最少再过多久,他们会再一次全面在同一直线上
解析:
ui=2*π/Ti,选择行星0为参考点,行星i的相对角速度为
t1=(T0*T1)/(2*(abs(T1-T0))
import java.math.*;
import java.util.*;
public class Main {
public static void main(String[ ] args)
{
Scanner cin = new Scanner(System.in);
int n,cnt;
int [ ] t =new int[1100];
int [ ]s = new int [1100];
BigInteger a,b,g,mo = null,de = null;
while(cin.hasNext())
{
n = cin.nextInt();
for(int i = 0;i<n;i++)
s[i] = cin.nextInt();
for(int i = 1;i<n;i++)
{
a = BigInteger.valueOf(s[i]*s[0]);//t0*t1
b = BigInteger.valueOf(Math.abs(s[i]-s[0])*2);//2*(t0-t1)
g = a.gcd(b);
if(i == 1)
{
mo = a.divide(g);
de = b.divide(g);
}
else
{
a = a.divide(g);
b = b.divide(g);
mo = mo.multiply(a).divide(mo.gcd(a));
de = de.gcd(b);
}
}
System.out.println(mo+" "+de);
}
cin.close();
}
}
最后
以上就是活力毛豆为你收集整理的java大数运算(BigInteger,BigDecimal)BigDecimal的全部内容,希望文章能够帮你解决java大数运算(BigInteger,BigDecimal)BigDecimal所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复