• 大数-加减乘除模


      打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 }
    复制代码

     

     

     

     

     

     
  • 相关阅读:
    usaco-4.1-nuggets-passed
    usaco-3.4-rockers-passed
    usaco-3.4-fence9-passed
    usaco-3.4-heritage-passed
    usaco-3.3-game1-passed
    usaco-3.3-range-passed
    usaco-3.3-camelot-passed
    6.23课堂作业
    初识JVM虚拟机
    JDK安装以及配置环境变量的步骤
  • 原文地址:https://www.cnblogs.com/caijiaming/p/10720738.html
Copyright © 2020-2023  润新知