将一个 a.bed的数转换成正常形式
import java.math.*;
import java.util.*;
public class Main {
public static void main(String[] args)
{
Scanner cin = new Scanner (System.in);
BigDecimal a = cin.nextBigDecimal();//可以读入指数呦
a = a.stripTrailingZeros();//清除末尾的0
System.out.println(a.toPlainString());
//toPlainString 返回不带指数字段的此 BigDecimal 的字符串表示形式
}
}
大数阶乘
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=28
代码如下:
- import java.io.*;
- import java.math.BigInteger;
- import java.util.*;
- public class Main
- {
- public static void main(String args[])
- {
- Scanner cin = new Scanner(System.in);
- int n = cin.nextInt();
- BigInteger ans = BigInteger.ONE;
- for(int i = 1; i <= n; ++i)
- ans = ans.multiply(BigInteger.valueOf(i));
- System.out.println(ans);
- }
- }
棋盘覆盖
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=45
代码如下:
- import java.math.BigInteger;
- import java.util.*;
- import java.io.*;
- public class Main
- {
- public static void main(String args[])
- {
- Scanner in = new Scanner(System.in);
- int test = in.nextInt();
- while(test-- > 0)
- {
- int n;
- n = in.nextInt();
- BigInteger a = new BigInteger("4");
- for(int i = 1; i < n; ++i)
- a = a.multiply(BigInteger.valueOf(4));
- System.out.println(a.subtract(BigInteger.valueOf(1)).divide(BigInteger.valueOf(3)));
- }
- }
- }
比较大小
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=73
代码如下:
- import java.io.*;
- import java.math.BigInteger;
- import java.util.*;
- public class Main
- {
- public static void main(String args[])
- {
- Scanner cin = new Scanner(System.in);
- while(cin.hasNext())
- {
- BigInteger a = cin.nextBigInteger();
- BigInteger b = cin.nextBigInteger();
- if(a.equals(BigInteger.ZERO) && b.equals(BigInteger.ZERO))
- break;
- int flag = a.compareTo(b);
- if(flag == -1)
- System.out.println("a<b");
- else if(flag == 0)
- System.out.println("a==b");
- else
- System.out.println("a>b");
- }
- }
- }
大数加法
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=103
代码如下:
- import java.math.BigInteger;
- import java.util.*;
- import java.io.*;
- public class Main
- {
- public static void main(String args[])
- {
- Scanner in = new Scanner(System.in);
- int n = in.nextInt();
- for(int i = 1; i <= n; ++i)
- {
- BigInteger a = in.nextBigInteger();
- BigInteger b = in.nextBigInteger();
- BigInteger ans = a.add(b);
- System.out.println("Case " + i + ":");
- System.out.println(a + " + " + b + " = " +ans);
- }
- }
- }
递推求值
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=114
代码如下:
- import java.io.*;
- import java.math.BigInteger;
- import java.util.*;
- public class Main
- {
- public static void main(String args[])
- {
- Scanner cin = new Scanner(System.in);
- BigInteger a[] = new BigInteger[100];
- while(cin.hasNext())
- {
- for(int i = 0; i <= 2; ++i)
- a[i] = cin.nextBigInteger();
- for(int i = 3; i <= 99; ++i)
- a[i] = a[i - 1].add(a[i - 2]).add(a[i - 3]);
- System.out.println(a[99]);
- }
- }
- }
高精度幂
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=155
代码如下:
- import java.io.*;
- import java.math.BigDecimal;
- import java.util.*;
- public class Main
- {
- public static void main(String args[])
- {
- Scanner cin = new Scanner(System.in);
- while(cin.hasNext())
- {
- BigDecimal ans = cin.nextBigDecimal();
- int n = cin.nextInt();
- String res = ans.pow(n).stripTrailingZeros().toPlainString(); //整数去掉小数点和后面的0
- if(res.startsWith("0")) //去掉前导0
- {
- res = res.substring(1);
- }
- System.out.println(res);
- }
- }
- }
大数运算:
- import java.util.*;
- import java.math.*;
- public class Main{
- public static void main(String args[]){
- Scanner cin = new Scanner(System.in);
- BigInteger a, b;
- //以文件EOF结束
- while (cin.hasNext()){
- a = cin.nextBigInteger();
- b = cin.nextBigInteger();
- System.out.println(a.add(b)); //大整数加法
- System.out.println(a.subtract(b)); //大整数减法
- System.out.println(a.multiply(b)); //大整数乘法
- System.out.println(a.divide(b)); //大整数除法(取整)
- System.out.println(a.remainder(b)); //大整数取模
- //大整数的比较
- if( a.compareTo(b) == 0 ) System.out.println("a == b"); //大整数a==b
- else if( a.compareTo(b) > 0 ) System.out.println("a > b"); //大整数a>b
- else if( a.compareTo(b) < 0 ) System.out.println("a < b"); //大整数a<b
- //大整数绝对值
- System.out.println(a.abs()); //大整数a的绝对值
- //大整数的幂
- int exponent=10;
- System.out.println(a.pow(exponent)); //大整数a的exponent次幂
- //返回大整数十进制的字符串表示
- System.out.println(a.toString());
- //返回大整数p进制的字符串表示
- int p=8;
- System.out.println(a.toString(p));
- }
- }
- }
大数:
java大数(2013长春网络赛)--hdu4762
总结一下:
1.java提交类要写Main。
2.读取大数。
1 Scanner read=new Scanner(System.in); 2 BigInteger m; 3 m=read.nextBigInteger();
3.基本类型转化成大数。
1 BigInteger q=BigInteger.valueOf(n);
4.大数最大公约数:
1 BigInteger a=p.gcd(q);
5.finally函数只能写在try-catch后面
1 import java.math.*; 2 import java.util.*; 3 public class Main { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 Scanner read=new Scanner(System.in); 11 try{ 12 int t; 13 BigInteger m; 14 int n; 15 t=read.nextInt(); 16 while(t-->0){ 17 m=read.nextBigInteger(); 18 n=read.nextInt(); 19 BigInteger p=m.pow(n-1); 20 BigInteger q=BigInteger.valueOf(n); 21 BigInteger a=p.gcd(q); 22 System.out.println(q.divide(a)+"/"+p.divide(a)); 23 } 24 } 25 finally{ 26 read.close(); 27 } 28 29 } 30 }
计算大实数R^n的值。
- import java.io.*;
- import java.math.*;
- import java.util.*;
- import java.text.*;
- public class Main {
- public static void main(String[] args) {
- Scanner cin = new Scanner(System.in);
- BigDecimal num;//定义一个大实数
- int ep,sta, end, i;
- String st;
- while(cin.hasNext()/*相当于C++的!=EOF*/) {
- num = cin.nextBigDecimal(); //底数
- ep = cin.nextInt(); //指数
- num = num.pow(ep); //计算num^ep
- st = new String(num.toPlainString()); //转为字符串
- sta = 0;
- while(st.charAt(sta) == '0') sta++; //去掉前缀的0
- end = st.length() -1;
- while(st.charAt(end)=='0') end--; //去掉后缀的0
- if(st.charAt(end)=='.') end--; //若小数点后没0,去掉
- for(i=sta; i<=end; i++)
- System.out.print(st.charAt(i));
- System.out.println();
- }
- System.exit(0);
- }
- }
Input
输入第一行为数据组数T (T<=20)。以下每行为一组数据,仅包含一个整数n (2<=n<=1,000,000)和一个长度不超过20的非空01串S。
Output
对于每组数据,输出S的第一次出现中,第一个字符的位置。小数点后的第一个数字的位置为0。输入保证答案不超过100。
Sample Input
2
2 101
1202 110011
Sample Output
2
58
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args)
{
Scanner cin = new Scanner(System.in);
int T = cin.nextInt();
for(int t=1;t<=T;t++)
{
int num = cin.nextInt();
String str = cin.next();
BigDecimal d = Sqrt(num);//sqrt(num),最多保存150位。
BigInteger x =d.toBigInteger();//取整数部分
d = d.subtract(BigDecimal.valueOf(x.longValue()));//保留小数部分
String hxl = Tostring(d);//将小数部分转化为二进制数字。
int tom = hxl.indexOf(str);//查找第一次出现的位置。
if(tom==-1) tom = 0;
System.out.println(tom);
}
}
private static String Tostring(BigDecimal d)
{
/**
* 将小数部分转化为二进制数字。
* 每次乘2,取整数部分就可以。
* 长度最长为150.
* 如果数字太大会超时的。如果数字太小,会不精确。
*/
String tom = new String();
int n = 150;
while(!d.equals(BigDecimal.ZERO)&& (n--)!=0)
{
d = d.multiply(BigDecimal.valueOf(2));
BigInteger x = d.toBigInteger();
tom+=x;
d = d.subtract(BigDecimal.valueOf(x.longValue()));
}
return tom;
}
private static BigDecimal Sqrt(int num) {
/***
* 将整数num模拟开根号。
*/
BigDecimal sqrtNum = BigDecimal.valueOf(0);
boolean isFindSqrt = false;
int key = (int)Math.sqrt(num*1.0);
sqrtNum = BigDecimal.valueOf(key*1.0);
if(key*key == num) isFindSqrt = true;
if(!isFindSqrt)//不能刚好整除,调用函数,获得精确值。
{
sqrtNum = recuFindSqrt(num,BigDecimal.valueOf(key),
isFindSqrt,BigDecimal.valueOf(1));
}
return sqrtNum;
}
private static BigDecimal recuFindSqrt(int num, BigDecimal sqrtValue,
boolean isFindSqrt, BigDecimal ac) {
/**
* 从每一位开始寻找,从0--9枚举。找最接近的点的方法。
* 暴力。(⊙o⊙)…
*/
ac = ac.multiply(BigDecimal.valueOf(10));
BigDecimal tempSqrt = BigDecimal.valueOf(0);
for(int i=0;i<10;i++)
{
tempSqrt = sqrtValue.add(BigDecimal.valueOf(i).divide(ac));
if(tempSqrt.multiply(tempSqrt).equals(BigDecimal.valueOf(num)))
{
isFindSqrt = true;
sqrtValue = tempSqrt;
}else if(tempSqrt.multiply(tempSqrt).compareTo(BigDecimal.valueOf(num))==1)
{
tempSqrt = sqrtValue.add(BigDecimal.valueOf(i-1).divide(ac));
sqrtValue = tempSqrt;
break;
}
}
BigDecimal temp = tempSqrt;
if(temp.toString().length()<=150 && isFindSqrt==false)
{
sqrtValue = recuFindSqrt(num, tempSqrt, isFindSqrt, ac);
}
return sqrtValue;
}
}