大数-加减乘除模

  打2017icpc沈阳站的时候遇到了大数的运算,发现java与c++比起来真的很赖皮,竟然还有大数运算的函数,为了以后打比赛更快的写出大数的算法并且保证不错,特意在此写一篇博客,

记录java的大数运算,也算是ACM java写法的入门:

  学习博客:https://www.cnblogs.com/wkfvawl/p/9377441.html

进入到eclipse界面

第一步:file->new->java project->起名->finish

第二步:进入到刚才建的工程里,右键src->new->package->起名->finish

第三步:进入到刚才建的package里,右键name->new->class->起名(这里起名要注意,因为比赛时如果交java代码,这里的类名就要命名为Main,区分大小写

1.Java的输入与输出

Java的输入是先定义一个scanner,然后用这个进行输入,并且每一种输入都有相应的输入函数,具体如下:

        Scanner cin =new Scanner(System.in);
        int a;
        double b;
        BigInteger c;
        String d;
        a=cin.nextInt();
        b=cin.nextDouble();
        c=cin.nextBigInteger();
        d=cin.next();
        //每种类型都有相应的函数输入
        System.out.println(a);
        System.out.println(b);    
        System.out.println(c);
        System.out.println(d);

下面给几个入门代码:

输出Hello World

package ACM代码;

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String args[]) {
        System.out.println("Hello World!");
        
    }
}

计算a+b

package ACM代码;

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String args[]) {
        Scanner cin=new Scanner(System.in);
        int a,b;
        a=cin.nextInt();
        b=cin.nextInt();
        System.out.println(a+b);
        
    }
}

多组输入输出

package ACM代码;

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String args[]) {
        Scanner cin=new Scanner(System.in);
        int a,b;
        while(cin.hasNext()) {
            a=cin.nextInt();
            b=cin.nextInt();
            System.out.println(a+b);
        }
    }
}

2、下面是重头戏了,大数处理!

下面就开始说大数的相关操作

首先我们需要导包,即BigIntegr类 和 BigDecimal类所在的包

import java,math.*;

*就代表导入包math里面所有的类,如果你不喜欢看到 *

那么你也可以写 import java,math.BigInteger; import java,math.BigDecimal;

1.大整数的加减乘除求余等计算:

/*
 * 大数的加减运算不同于普通函数的加减乘除运算
 * 加----a+b:a=a.add(b)
 * 减----a-b:a=a.subtract(b)
 * 乘----a*b:a=a.multiply(b)
 * 除----a/b:a=a.divide(b)
 * 求余--a%b:a=a.mod(b)
 * 转换--a=b:b=BigInteger.valueOf(a)
 * 比较--if(ans.compareTo(x)==0) System.out.println("相等")
 * System.out.println("a + b = "+ans_add); // 这里的‘+’ (第二个) 是连接的意思
 */

package ACM代码;

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String args[]) {
        Scanner cin=new Scanner(System.in);
        BigInteger a,b,x,y;
        BigInteger ans_add,ans_sub,ans_mul,ans_div,ans_mod;
        a=cin.nextBigInteger();
        b=cin.nextBigInteger();
        ans_add=a.add(b);
        ans_sub=a.subtract(b);
        ans_mul=a.multiply(b);
        ans_div=a.divide(b);
        ans_mod=a.mod(b);
        x=BigInteger.valueOf(1);//转化
        System.out.println("a+b="+ans_add);
        System.out.println("a-b="+ans_sub);
        System.out.println("a*b="+ans_mul);
        System.out.println("a/b="+ans_div);
        System.out.println("a%b="+ans_mod);
        System.out.println("x="+x);
        if(a.compareTo(b)==0) //比较是否相等
            System.out.println("相等");
        else 
            System.out.println("不相等");
        
    }
}

3、下面来几道题目练练手:

UVA—10106:a*b

题目链接:https://vjudge.net/problem/UVA-10106

看代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String args[]) {
        Scanner cin=new Scanner(System.in);
        BigInteger a,b;
        while(cin.hasNext()) {
            a=cin.nextBigInteger();
            b=cin.nextBigInteger();
            System.out.println(a.multiply(b));
        }
        
    }
}

 UVA—424:多个数连续相加,遇到0就停止相加,给出结果

题目链接:https://vjudge.net/problem/UVA-424

看代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String args[]) {
        Scanner cin=new Scanner(System.in);
        BigInteger y=BigInteger.valueOf(0);
        BigInteger ans=BigInteger.valueOf(0);
        BigInteger x;
        while(cin.hasNext()) {
            x=cin.nextBigInteger();
            if(x.compareTo(y)==0) break;
            ans=ans.add(x);
//            System.out.println(x);
//            System.out.println(ans);
        }
        System.out.println(ans);
    }
}

HDU - 1042:计算阶乘:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042

看代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String args[]) {
        Scanner cin=new Scanner(System.in);
        
        int n;
        while(cin.hasNext()) {
            n=cin.nextInt();
            BigInteger ans=BigInteger.valueOf(1);
            for(int i=1;i<=n;i++) {
                ans=ans.multiply(BigInteger.valueOf(i));
            }
            System.out.println(ans);
        }
        
    }
}

UVA —10494

求两个大数相除或者求余

题目链接:https://vjudge.net/problem/UVA-10494

代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String args[]) {
        
        Scanner cin = new Scanner(System.in);
        BigInteger n,m;
        String s;
        while(cin.hasNext()) {
            n=cin.nextBigInteger();
            s=cin.next();
            m=cin.nextBigInteger();
            if(s.equals("%")) System.out.println(n.mod(m));
            else System.out.println(n.divide(m));
        }
    }
}

POJ1001 计算a^b 注意是小数

题目链接:http://poj.org/problem?id=1001

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    
    public static void main(String args[]) {
        
        Scanner cin = new Scanner(System.in);
        while(cin.hasNext()) {
            BigDecimal R=cin.nextBigDecimal();
            int n=cin.nextInt();
            R=R.pow(n);
            String ans=R.stripTrailingZeros().toPlainString();//去掉后面没用的0
            if(ans.charAt(0)=='0') ans=ans.substring(1);//返回以第一个字符开始的串
            System.out.println(ans);
            
        }
    }
}

关于BigDecimal的用法大致上和BigInteger一样。

不过这里需要提一下,在进行大浮点数运算的时候,小数点后面可能会含有多余的后导0

比如0.5000,在题目要求中可能只需要输出0.5

当然,有的题目可能还会要求小数点前面的0也要去掉,输入.5

这时候我们就需要去除掉后导0

转化成 字符型的

方法如下:

String ans=R.stripTrailingZeros().toPlainString();//去掉后面没用的0
            if(ans.charAt(0)=='0') ans=ans.substring(1);//返回以第一个字符开始的串

 

 

复制代码
import java.math.BigInteger;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        BigInteger a, b, t = new BigInteger("1");
        String c;
        while (s.hasNext()) {
            a = s.nextBigInteger();
            c = s.next();
            b = s.nextBigInteger();
            if (c.equals("%"))///equals用来比较的是两个对象的内容是否相等
                t = a.mod(b);
            if (c.equals("/"))
                t = a.divide(b);
            System.out.println(t);
        }
    }
}
复制代码

 

POJ1001 计算a^b 注意是小数

 

复制代码
 1 import java.util.*;
 2 import java.math.*;
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         Scanner input = new Scanner(System.in);
 8         while (input.hasNext()) {
 9             BigDecimal a = input.nextBigDecimal(); // 大数类的double;
10             int b = input.nextInt();
11             a = a.pow(b);
12             String ans = a.stripTrailingZeros().toPlainString(); // 去掉尾部零,转换成非科学计数法字符串
13             if (ans.charAt(0) == '0') { // 如果以0开头
14                 ans = ans.substring(1); // 返回以位置1开头的该字符串
15             }
16             System.out.println(ans);
17         }
18     }
19 }
复制代码

 

关于BigDecimal的用法大致上和BigInteger一样。

不过这里需要提一下,在进行大浮点数运算的时候,小数点后面可能会含有多余的后导0

比如0.5000,在题目要求中可能只需要输出0.5

当然,有的题目可能还会要求小数点前面的0也要去掉,输入.5

这时候我们就需要去除掉后导0

转化成 字符型的

方法如下:

复制代码
1 String str;
2 str=ans.stripTrailingZeros().toPlainString();//去除所有后导0,并且转化成字符型
3 //ans为大浮点数运算后得到的答案
4 //如果小数点前面的0也需要去掉,那么输出的时候处理一下即可:
5 if(str.charAt(0)=='0')//如果以0开头
6         System.out.println(str.substring(1));//返回以位置1开头的字符串
7 else
8         System.out.println(str);
复制代码

 

HDU—1023:计算卡特兰数

 

复制代码
 1 //卡特兰数递推公式h(n)=h(n-1)*(4*n-2)/(n+1);
 2 import java.math.*;
 3 import java.util.*;
 4 public class Main {
 5   public static void main(String[] args) {
 6       Scanner cin = new Scanner(System.in);
 7       BigInteger dp[];//定义一个数组
 8       dp=new BigInteger[110];//规定数组的大小
 9       dp[1]=BigInteger.valueOf(1);
10       int i,m;
11       for(i=2;i<=100;i++)//卡特兰数打表
12       {
13           dp[i]=dp[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));  
14       }
15       while(cin.hasNext())
16       {
17           m=cin.nextInt();
18           System.out.println(dp[m]);
19       }
20   }
21 }
复制代码

 

 

 

 

 

 
原文地址:https://www.cnblogs.com/caijiaming/p/10720738.html