高精度

java的框架:

import java.io.*;
import java.util.*;
import java.math.*;
public class Main{
    public static void main(String []args){
        Scanner cin=new Scanner(System.in);
     
    }
     
}
import的作用:简单的说就是导入,java有很多方法你可以直接使用,但是被封装在各个包(类)里面,你需要先导包,才能使用这个包里的方法。

  *的作用:表示该包中的所有类,*是通配符。

  import java.io*;表示引入java.io包里的所有类。

  import java.util*;导入包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。其实不用太理解,只需要知道这个跟C/C++中的头文件一样都要加上。

  import java.math.*;表示导入跟数学计算相关的所有类。其中含有BigInteger和BigDecimal这两个非常好用的类,分别处理超长整数和超长浮点数。

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();    相除取整

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.public int compareTo();

14.boolean equals(); 是否相等

15.BigInteger构造函数:
一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;
BigInteger(String val,int radix);
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger

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.nextBigInteger();//读入一个BigInteger;  
     System.out.print(m);  
    }  
运用:

import java.math.BigDecimal;  
import java.math.BigInteger;  
import java.text.DecimalFormat;  
import java.util.Scanner;  
public class Main    
{    
    public static void main(String args[])    
    {  
        Scanner sca = new Scanner(System.in);  
        BigInteger a,b;  
        int c;//为小数设置精度  
        char op;//运算符  
        String s;  
        while(sca.hasNext()){  
            a = sca.nextBigInteger();  
            s = sca.next();  
            op = s.charAt(0);  
            b = sca.nextBigInteger();  
            if(op == '+')  
                System.out.println(a.add(b));  
            else if(op == '-')  
                System.out.println(a.subtract(b));  
            else if(op == '*')  
                System.out.println(a.multiply(b));  
            else{  
                BigDecimal t1,t2,eps;  
                String s1,s2,temp;  
                s1 = a.toString();  
                s2 = b.toString();  
                t1 = new BigDecimal(s1);  
                t2 = new BigDecimal(s2);  
                c = sca.nextInt();  
                eps = t1.divide(t2,c,4);  
                //System.out.println(a + " " + b + " " + c);    
                //System.out.println(t1.doubleValue() + " " + t2.doubleValue() + " " + c);  
                System.out.print(a.divide(b) +" "+ a.mod(b)+" ");  
                if(c != 0){  
                    temp = "0.";  
                    for(int i = 0; i < c; i++)  
                        temp += "0";  
                    DecimalFormat gd = new DecimalFormat(temp);  
                    System.out.println(gd.format(eps));  
                }  
                else  
                    System.out.println(eps);  
            }  
        }  
    }  
}  
C++高精模板:

1.高精度加法

算法复杂度:o(n)

    #include<iostream>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;  
    const int L=110;  
    string add(string a,string b)//只限两个非负整数相加  
    {  
        string ans;  
        int na[L]={0},nb[L]={0};  
        int la=a.size(),lb=b.size();  
        for(int i=0;i<la;i++) na[la-1-i]=a[i]-'0';  
        for(int i=0;i<lb;i++) nb[lb-1-i]=b[i]-'0';  
        int lmax=la>lb?la:lb;  
        for(int i=0;i<lmax;i++) na[i]+=nb[i],na[i+1]+=na[i]/10,na[i]%=10;  
        if(na[lmax]) lmax++;  
        for(int i=lmax-1;i>=0;i--) ans+=na[i]+'0';  
        return ans;  
    }  
    int main()  
    {  
        string a,b;  
        while(cin>>a>>b) cout<<add(a,b)<<endl;  
        return 0;  
    }  

2.高精度减法

算法复杂度:o(n)

    #include<iostream>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;  
    const int L=110;  
    string sub(string a,string b)//只限大的非负整数减小的非负整数  
    {  
        string ans;  
        int na[L]={0},nb[L]={0};  
        int la=a.size(),lb=b.size();  
        for(int i=0;i<la;i++) na[la-1-i]=a[i]-'0';  
        for(int i=0;i<lb;i++) nb[lb-1-i]=b[i]-'0';  
        int lmax=la>lb?la:lb;  
        for(int i=0;i<lmax;i++)  
        {  
            na[i]-=nb[i];  
            if(na[i]<0) na[i]+=10,na[i+1]--;  
        }  
        while(!na[--lmax]&&lmax>0)  ;lmax++;  
        for(int i=lmax-1;i>=0;i--) ans+=na[i]+'0';  
        return ans;  
    }  
    int main()  
    {  
        string a,b;  
        while(cin>>a>>b) cout<<sub(a,b)<<endl;  
        return 0;  
    }  

3.高精度乘法

(1)算法复杂度:o(n^2)

    #include<iostream>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;  
    const int L=110;  
    string mul(string a,string b)//高精度乘法a,b,均为非负整数  
    {  
        string s;  
        int na[L],nb[L],nc[L],La=a.size(),Lb=b.size();//na存储被乘数,nb存储乘数,nc存储积  
        fill(na,na+L,0);fill(nb,nb+L,0);fill(nc,nc+L,0);//将na,nb,nc都置为0  
        for(int i=La-1;i>=0;i--) na[La-i]=a[i]-'0';//将字符串表示的大整形数转成i整形数组表示的大整形数  
        for(int i=Lb-1;i>=0;i--) nb[Lb-i]=b[i]-'0';  
        for(int i=1;i<=La;i++)  
            for(int j=1;j<=Lb;j++)  
            nc[i+j-1]+=na[i]*nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(先不考虑进位)  
        for(int i=1;i<=La+Lb;i++)  
            nc[i+1]+=nc[i]/10,nc[i]%=10;//统一处理进位  
        if(nc[La+Lb]) s+=nc[La+Lb]+'0';//判断第i+j位上的数字是不是0  
        for(int i=La+Lb-1;i>=1;i--)  
            s+=nc[i]+'0';//将整形数组转成字符串  
        return s;  
    }  
    int main()  
    {  
        string a,b;  
        while(cin>>a>>b) cout<<mul(a,b)<<endl;  
        return 0;  
    }  
(2)算法复杂度:o(n*log(n))(高精度乘高精度)

    #include <iostream>  
    #include <cstdio>  
    #include <algorithm>  
    #include <cstring>  
    #include <cmath>  
    #include <map>  
    #include <queue>  
    #include <set>  
    #include <vector>  
    using namespace std;  
    #define L(x) (1 << (x))  
    const double PI = acos(-1.0);  
    const int Maxn = 133015;  
    double ax[Maxn], ay[Maxn], bx[Maxn], by[Maxn];  
    char sa[Maxn/2],sb[Maxn/2];  
    int sum[Maxn];  
    int x1[Maxn],x2[Maxn];  
    int revv(int x, int bits)  
    {  
        int ret = 0;  
        for (int i = 0; i < bits; i++)  
        {  
            ret <<= 1;  
            ret |= x & 1;  
            x >>= 1;  
        }  
        return ret;  
    }  
    void fft(double * a, double * b, int n, bool rev)  
    {  
        int bits = 0;  
        while (1 << bits < n) ++bits;  
        for (int i = 0; i < n; i++)  
        {  
            int j = revv(i, bits);  
            if (i < j)  
                swap(a[i], a[j]), swap(b[i], b[j]);  
        }  
        for (int len = 2; len <= n; len <<= 1)  
        {  
            int half = len >> 1;  
            double wmx = cos(2 * PI / len), wmy = sin(2 * PI / len);  
            if (rev) wmy = -wmy;  
            for (int i = 0; i < n; i += len)  
            {  
                double wx = 1, wy = 0;  
                for (int j = 0; j < half; j++)  
                {  
                    double cx = a[i + j], cy = b[i + j];  
                    double dx = a[i + j + half], dy = b[i + j + half];  
                    double ex = dx * wx - dy * wy, ey = dx * wy + dy * wx;  
                    a[i + j] = cx + ex, b[i + j] = cy + ey;  
                    a[i + j + half] = cx - ex, b[i + j + half] = cy - ey;  
                    double wnx = wx * wmx - wy * wmy, wny = wx * wmy + wy * wmx;  
                    wx = wnx, wy = wny;  
                }  
            }  
        }  
        if (rev)  
        {  
            for (int i = 0; i < n; i++)  
                a[i] /= n, b[i] /= n;  
        }  
    }  
    int solve(int a[],int na,int b[],int nb,int ans[])  
    {  
        int len = max(na, nb), ln;  
        for(ln=0; L(ln)<len; ++ln);  
        len=L(++ln);  
        for (int i = 0; i < len ; ++i)  
        {  
            if (i >= na) ax[i] = 0, ay[i] =0;  
            else ax[i] = a[i], ay[i] = 0;  
        }  
        fft(ax, ay, len, 0);  
        for (int i = 0; i < len; ++i)  
        {  
            if (i >= nb) bx[i] = 0, by[i] = 0;  
            else bx[i] = b[i], by[i] = 0;  
        }  
        fft(bx, by, len, 0);  
        for (int i = 0; i < len; ++i)  
        {  
            double cx = ax[i] * bx[i] - ay[i] * by[i];  
            double cy = ax[i] * by[i] + ay[i] * bx[i];  
            ax[i] = cx, ay[i] = cy;  
        }  
        fft(ax, ay, len, 1);  
        for (int i = 0; i < len; ++i)  
            ans[i] = (int)(ax[i] + 0.5);  
        return len;  
    }  
    string mul(string sa,string sb)  
    {  
        int l1,l2,l;  
        int i;  
        string ans;  
        memset(sum, 0, sizeof(sum));  
        l1 = sa.size();  
        l2 = sb.size();  
        for(i = 0; i < l1; i++)  
            x1[i] = sa[l1 - i - 1]-'0';  
        for(i = 0; i < l2; i++)  
            x2[i] = sb[l2-i-1]-'0';  
        l = solve(x1, l1, x2, l2, sum);  
        for(i = 0; i<l || sum[i] >= 10; i++) // 进位  
        {  
            sum[i + 1] += sum[i] / 10;  
            sum[i] %= 10;  
        }  
        l = i;  
        while(sum[l] <= 0 && l>0)    l--; // 检索最高位  
        for(i = l; i >= 0; i--)    ans+=sum[i] + '0'; // 倒序输出  
        return ans;  
    }  
    int main()  
    {  
        cin.sync_with_stdio(false);  
        string a,b;  
        while(cin>>a>>b) cout<<mul(a,b)<<endl;  
        return 0;  
    }  
(3)
算法复杂度:o(n)(高精度乘单精度)

    #include<iostream>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;  
    const int L=100005;  
    int na[L];  
    string mul(string a,int b)//高精度a乘单精度b  
    {  
        string ans;  
        int La=a.size();  
        fill(na,na+L,0);  
        for(int i=La-1;i>=0;i--) na[La-i-1]=a[i]-'0';  
        int w=0;  
        for(int i=0;i<La;i++) na[i]=na[i]*b+w,w=na[i]/10,na[i]=na[i]%10;  
        while(w) na[La++]=w%10,w/=10;  
        La--;  
        while(La>=0) ans+=na[La--]+'0';  
        return ans;  
    }  
    int main()  
    {  
        string a;  
        int b;  
        while(cin>>a>>b) cout<<mul(a,b)<<endl;  
        return 0;  
    }  

除法(高精度除单精度)

string chu(string a,int b)
{
    string ans;
    int La=a.size();
    fill(na,na+L,0);
    for(int i=La-1;i>=0;i--) na[La-i-1]=a[i]-'0';
    for(int i=La-1;i>=0;i--)  na[i-1]+=(na[i]%b)*10,na[i]/=b;
    while(!na[La-1])  La--;
    La--;
    while(La>=0) ans+=na[La--]+'0';
    return ans;
}

http://blog.csdn.net/wlxsq/article/details/49717209(剩下的看这里吧)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值