1.Integer Inquiry
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1047
解法:一道求大數之和,我們利用java裡的BigInteger就可以輕鬆的解決,不過需要注意下格式的問題,每輸出一個就要空一行,最後一個不用
程式碼:
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] arg) { Scanner in=new Scanner(System.in); int t; while(in.hasNext()) { t=in.nextInt(); while(t-->0) { BigInteger b=new BigInteger("0"); while(in.hasNextBigInteger()) { BigInteger c=new BigInteger("0"); c=in.nextBigInteger(); if(!c.equals(BigInteger.ZERO)) { b=b.add(c); } else { System.out.println(b); if(t!=0) System.out.println(); break; } } } } } }
2.Exponentiation
題目:https://vjudge.net/problem/POJ-1001/origin
解法:這道是一個浮點數的次冪求解,通過java裡的BigDecimal的pow方法,即可完成對應的求解。
對於輸出有特殊要求,小數點後捨去無意義的0,用到stripTrailingZeros()方法去除所有尾部的0,然後再用toPlainString()將BigDecimal轉化為String
之後,在比對轉化的字串的第一個字元是否為“0”,如果為0,則去掉它只保留小數點之後的數,利用substring(1),擷取字串
程式碼:
import java.math.BigDecimal; import java.util.Scanner; public class Main { public static void main(String[] arg) { Scanner in=new Scanner(System.in); while(in.hasNext()) { BigDecimal a=in.nextBigDecimal(); int k=in.nextInt(); a=a.pow(k); String str=a.stripTrailingZeros().toPlainString(); if(str.charAt(0)=='0') System.out.println(str.substring(1)); else System.out.println(str); } } }
3.How many Fibs?
題目:https://vjudge.net/problem/POJ-2413/origin
思路:這是一道求在一定的範圍內,包含的斐波那契數的個數。由於範圍是10的100次方,因此我們設定大整數陣列的長度為10000,足以包括。
程式碼:
import java.math.BigInteger; import java.util.Scanner; public class Main { static BigInteger a[]=new BigInteger[10000]; public static void main(String[] arg) { Scanner in=new Scanner(System.in); for(int i=0;i<10000;i++) a[i]=BigInteger.ZERO; a[0]=BigInteger.valueOf(1); a[1]=BigInteger.valueOf(2); for(int i=2;i<10000;i++) a[i]=a[i].add(a[i-1].add(a[i-2])); BigInteger b,c; while(true) { b=in.nextBigInteger(); c=in.nextBigInteger(); if(b.equals(BigInteger.ZERO)&&c.equals(BigInteger.ZERO)) break; int res=0; for(int i=0;i<10000;i++) { if((a[i].compareTo(b)==1||a[i].compareTo(b)==0)&&(a[i].compareTo(c)==-1||a[i].compareTo(c)==0)) res++; if(a[i].compareTo(c)==1) break; } System.out.println(res); } } }
4.Segment
題目:http://acm.hdu.edu.cn/showproblem.php?pid=5666
解法:這是一道求在一個三角形區域內的整數點的個數,不包含線上上的點。通過遞推分析,找規律後知道,個數為:(q-1)*(q-2)/2%p
由於q很大,所以我們需要用到大整數來進行求解。
程式碼:
import java.math.BigInteger; import java.util.Scanner; public class Main{ public static void main(String[] arg) { Scanner in=new Scanner(System.in); int T=in.nextInt(); while(T-->0) { BigInteger q=in.nextBigInteger(); BigInteger p=in.nextBigInteger(); BigInteger f=q.subtract(BigInteger.valueOf(2)); BigInteger res=q.subtract(BigInteger.ONE).multiply(f).divide(BigInteger.valueOf(2)); res=res.mod(p); System.out.println(res); } } }
5.Problem B
題目:https://vjudge.net/problem/HDU-5686/origin
解法:這應該是百度的某道題,模擬幾組資料後發現竟然是一個斐波那契數列,因此就很簡單了,N<=200的因此普通的longlong滿足不了,我們需要使用BigInteger
程式碼:
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] arg) { Scanner in=new Scanner(System.in); BigInteger a[]=new BigInteger[10000]; for(int i=0;i<10000;i++) a[i]=BigInteger.ZERO; a[0]=BigInteger.valueOf(1); a[1]=BigInteger.valueOf(1); for(int i=2;i<10000;i++) a[i]=a[i].add(a[i-1].add(a[i-2])); while(in.hasNext()) { int k=in.nextInt(); if(k>=1&&k<=200) System.out.println(a[k]); } } }