大数问题,通常用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]); } } }
分析(转):
简单递推+大数。
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()); } }