大数模板

来源:互联网 发布:删除数据库下所有表 编辑:程序博客网 时间: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

Ⅲ.基本操作

  1. 读入:

用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