大数问题,通常用JAVA

e.g.

HDU1002

简单加法

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

public class Main {
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int t=cin.nextInt();
        cin.nextLine();
        int cnt=0;
        while(t!=0)
        {
            t--;
            String s1=cin.next();
            String s2=cin.next();
            BigInteger a1=new BigInteger(s1);
            BigInteger a2=new BigInteger(s2);
            System.out.println("Case "+(++cnt)+":");
            System.out.print(a1+" + "+a2+" = ");
            System.out.println(a1.add(a2));
            if(t!=0)
                System.out.println();
        }
        
    }
}

 HDU1715 大斐波那契数

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

public class Main {
    private static BigInteger[] fib;
    public static void f(){
        fib=new BigInteger[1005];
        fib[2]=new BigInteger("1");
        fib[1]=fib[2];
        for(int i=3;i<1005;i++)
        {
            fib[i]=fib[i-1].add(fib[i-2]);
        }
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int t=cin.nextInt();
        cin.nextLine();
        int cnt=0;
        f();
        while(t!=0)
        {
            t--;
            cnt=cin.nextInt();
            System.out.println(fib[cnt]);
        }
        
    }
}

 HDU1865

分析(转):

    简单递推+大数。
    f[n]=f[n-1]+f[n-2]。

why?
    由于数字只有'1'和'2'这两种,那么当让第n
 位为1的时候,f[n]加上f[n-1];当让最后两位
 合并成2的时候,f[n]加上f[n-2](因为要保证
 倒数第二位一定是1)。

   算出来的f就是一个斐波那契数列。

WOW ,问题转化是极为巧妙的

  这种递推关系,说的严重点就是动态规划

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

public class Main {
    private static BigInteger[] fib;
    public static void f(){
        fib=new BigInteger[1005];
        fib[1]=new BigInteger("1");
        fib[0]=fib[1];
        for(int i=2;i<1005;i++)
        {
            fib[i]=fib[i-1].add(fib[i-2]);
        }
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int t=cin.nextInt();
        cin.nextLine();
        int cnt=0;
        f();
        while(t!=0)
        {
            t--;
            String s=cin.next();
            cnt=s.length();
            System.out.println(fib[cnt]);
        }
        
    }
}

  

HDU 1753 大明A+B(大小数加法,C模拟,Java BigDecimal)

c语言的话就是找到小数点后仿照大整数加法进行,但是有点麻烦,
如果用Java的BigDecimal的话瞬间变成水题,
但是要注意输出的格式,用stripTrailingZeros()方法除去末尾多余的0,
例如,若无此句,0.9+0.1的结果为1.0,而不是我们想要的1,
用toPlainString()方法则可以避免结果用科学计数法表示,
例如:若无此句,0.0000001+0.0000001的结果为2E-7而不是我们想要的0.0000002
import java.math.BigDecimal;  
import java.util.Scanner;  
  
public class Main {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        BigDecimal a,b;  
        while(sc.hasNext()){  
            a = sc.nextBigDecimal();  
            b = sc.nextBigDecimal();  
            System.out.println(a.add(b).stripTrailingZeros().toPlainString());  
        }  
    }  
}  

 

HDU1316

JAVA水题 暴力 BigInteger 大数

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

public class Main {
    private static BigInteger[] fib;
    public static void f(){
        fib=new BigInteger[1005];
        fib[1]=new BigInteger("1");
        fib[0]=fib[1];
        for(int i=2;i<1005;i++)
        {
            fib[i]=fib[i-1].add(fib[i-2]);
        }
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        BigInteger a1,a2;
        f();
        BigInteger dumy=BigInteger.ZERO;
        while(cin.hasNextBigInteger())
        {
            a1=cin.nextBigInteger();
            a2=cin.nextBigInteger();
            if(a1.compareTo(dumy)==0&&a2.compareTo(dumy)==0){
                break;
            }
            int cnt=0;
            for(int i=1;i<1005;i++)
            {
                if(fib[i].compareTo(a2)>0)break;
                if(fib[i].compareTo(a1)>=0&&fib[i].compareTo(a2)<=0){
                    cnt++;
                }
            }
            System.out.println(cnt);
        }
        
    }
    
}

 HDU1047

Integer Inquiry 大数加法

注意输出格式

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);
        int n=cin.nextInt();
        BigInteger d1,z=BigInteger.ZERO,sum;
        while((n--)!=0)
        {
            sum=z;
            while(cin.hasNextBigInteger())
            {
                d1=cin.nextBigInteger();
                if(d1.equals(z)){
                    break;
                }
                sum=sum.add(d1);
            }
            System.out.println(sum);
            if(n!=0){
                System.out.println();
            }
        }
        
    }
}

 HDU1063

大数的幂  

.stripTrailingZeros().toPlainString()
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);
        BigDecimal b1,ans,o=BigDecimal.ONE;
        int n;
        while(cin.hasNextBigDecimal())
        {
            b1=cin.nextBigDecimal();
            n=cin.nextInt();
            ans=o;
            for(int i=0;i<n;i++)
            {
                ans=ans.multiply(b1);
            }
            if(b1.compareTo(o)<0)
                System.out.println(ans.stripTrailingZeros().toPlainString().substring(1));
            else
                System.out.println(ans.stripTrailingZeros().toPlainString());
        }
    }

 

posted @ 2017-04-04 14:09  kimsimple  阅读(326)  评论(0编辑  收藏  举报