大数模板
来源:互联网 发布:删除数据库下所有表 编辑:程序博客网 时间:2024/06/15 20:45
两个大数相加:
string sum(string s1,string s2){ if(s1.length()<s2.length()) { string temp=s1; s1=s2; s2=temp; } int i,j; for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--) { s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节 if(s1[i]-'0'>=10) { s1[i]=char((s1[i]-'0')%10+'0'); if(i) s1[i-1]++; else s1='1'+s1; } } return s1;}
大数乘以整数:
string Multiply(string s,int x) //大数乘以整形数{ reverse(s.begin(),s.end()); int cmp=0; for(int i=0;i<s.size();i++) { cmp=(s[i]-'0')*x+cmp; s[i]=(cmp%10+'0'); cmp/=10; } while(cmp) { s+=(cmp%10+'0'); cmp/=10; } reverse(s.begin(),s.end()); return s;}
大数除以整形数:
string Except(string s,int x) //大数除以整形数{ int cmp=0,ok=0; string ans=""; for(int i=0;i<s.size();i++) { cmp=(cmp*10+s[i]-'0'); if(cmp>=x) { ok=1; ans+=(cmp/x+'0'); cmp%=x; } else{ if(ok==1) ans+='0'; //注意这里啊。才找出错误 } } return ans;}
大数乘法:
string sum(string s1,string s2) //大数加法{ if(s1.length()<s2.length()) { string temp=s1; s1=s2; s2=temp; } int i,j; for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--) { s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节 if(s1[i]-'0'>=10) { s1[i]=char((s1[i]-'0')%10+'0'); if(i) s1[i-1]++; else s1='1'+s1; } } return s1;}string Mult(string s,int x) //大数乘以整形数{ reverse(s.begin(),s.end()); int cmp=0; for(int i=0;i<s.size();i++) { cmp=(s[i]-'0')*x+cmp; s[i]=(cmp%10+'0'); cmp/=10; } while(cmp) { s+=(cmp%10+'0'); cmp/=10; } reverse(s.begin(),s.end()); return s;}string Multfa(string x,string y) //大数乘法{ string ans; for(int i=y.size()-1,j=0;i>=0;i--,j++) { string tmp=Mult(x,y[i]-'0'); for(int k=0;k<j;k++) tmp+='0'; ans=sum(ans,tmp); } return ans;}
浮点数的n次方:
string Multiply(string s,long x) //大数乘以整形数{ reverse(s.begin(),s.end()); long cmp=0; for(int i=0; i<s.size(); i++) { cmp=(s[i]-'0')*x+cmp; s[i]=(cmp%10+'0'); cmp/=10; } while(cmp) { s+=(cmp%10+'0'); cmp/=10; } reverse(s.begin(),s.end()); return s;}string Remove_later(string s) //删除一个字符串的后倒0{ int ok=1; for(int i=s.size()-1; i>=0; i--) { if(s[i]=='0'){ s.erase(i); } else if(s[i]=='.') { s.erase(i); ok=0; } else ok=0; if(ok==0) break; } return s;}string factorial(string s,int n) //浮点数的n次方{ if(n==0) return "1"; string cmp="",count=""; long x=0,point=0; for(int i=0; i<s.size(); i++) if(s[i]!='.') { cmp+=s[i]; x=x*10+(s[i]-'0'); } else point=s.size()-1-i; for(int i=1; i<n; i++) { cmp=Multiply(cmp,x); } int ans_point=cmp.size()-n*point; if(ans_point<0) { count+='.'; for(int i=ans_point; i!=0; i++) count+='0'; } string::iterator it=cmp.begin(); if(ans_point>=0&&ans_point<cmp.size()) cmp.insert(it+ans_point,'.'); count+=(Remove_later(cmp)); return count;}
字符串去除后导0函数,前导0可以先反转取后导:
string Remove_later(string s) //删除一个字符串的后倒0{ for(int i=s.size()-1; i>=0; i--) { if(s[i]=='0') s.erase(i); else break; } return s;}
java:
http://blog.csdn.net/m0_37802215/article/details/78012097
一个大数模板。
HDU 6026 Apple 2017ICPC青岛网赛 A (高精度+大数模版)
import java.util.*;import java.math.BigInteger;//import java.io.*;public class Currency { public static void main(String[] args){ Scanner cin=new Scanner(System.in); int n=cin.nextInt(); BigInteger c=new BigInteger ("0"); BigInteger d=new BigInteger("11");// System.out.println(c);// System.out.println(d); while(n--!=0){ BigInteger a=cin.nextBigInteger(); BigInteger b=cin.nextBigInteger(); System.out.println(a.compareTo(b)); } }}int b=4;BigInteger y1=BigInteger.valueOf(b);
在用C或者C++处理大数时感觉非常麻烦,但是在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大。
这两个类都在Java.math.*包中,因此每次必须在开头处引用该包。
Ⅰ基本函数:
static BigInteger ONE
BigInteger 的常量 1。
static BigInteger TEN
BigInteger 的常量 10。
static BigInteger ZERO
BigInteger 的常量 0。
1.valueOf(parament); 将参数转换为制定的类型
比如 int a=3;
BigInteger b=BigInteger.valueOf(a);
则b=3;
String s=”12345”;
BigInteger c=BigInteger.valueOf(s);
则c=12345;
2.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a. add(b);
3.subtract(); 相减
4.multiply(); 相乘
5.divide() ; 相除取整。 也可以不取整,使用a.divide(b,n, RoundingMode.FLOOR) n是小数点之后n位, RoundingMode.FLOOR是取舍模式
6.remainder(); 取余
7.pow(); a.pow(b)=a^b
8.gcd(); 最大公约数
9.abs(); 绝对值
10.negate(); 取反数
11.mod(); a.mod(b)=a%b=a.remainder(b);
12.max(); min();
13.pu;nlic int comareTo()
14.boolean equals(); 是否相等
15.sqrt();s=sqrt(s);开平方,需要使用类
public static BigDecimal sqrt(BigDecimal a) {//开方
BigDecimal l = BigDecimal.ZERO, r = a, mid = a; BigDecimal two = new BigDecimal("2"); BigDecimal eps = new BigDecimal(1e-120); while (l.compareTo(r.subtract(eps)) == -1) { mid = l.add(r).divide(two); if (mid.multiply(mid).compareTo(a) == 1) { r = mid; } else { l = mid; } } return mid;}
16.BigInteger构造函数:
一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;
BigInteger(String val,int radix);
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger
Ⅱ.基本常量:
A=BigInteger.ONE 1
B=BigInteger.TEN 10
C=BigInteger.ZERO 0
Ⅲ.基本操作
- 读入:
用Scanner类定义对象进行控制台读入,Scanner类在java.util.*包中
Scanner cin=new Scanner(System.in);// 读入
while(cin.hasNext()) //等同于!=EOF
{
int n;
BigInteger m;
n=cin.nextInt(); //读入一个int;
m=cin.BigInteger();//读入一个BigInteger;
System.out.print(m.toString());
}
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