高精度

                  高精度


 

高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方阶乘开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。

高精度加法

#include<stdio.h>
#include<string.h>
char a[1000],b[1000];
char c[1000];
int i;
void swap(char a[])
{
    char tmp;
    for(int i=0;i<strlen(a)/2;i++)
    {
        tmp=a[i];
        a[i]=a[strlen(a)-1-i];
        a[strlen(a)-1-i]=tmp;
    }
}
void add(char a[],char b[])
{
    for(i=0;i<strlen(a)&&i<strlen(b);i++)
    {
        c[i]+=a[i]+b[i]-'0';
            if(c[i]-'0'>=10)
            {
                c[i]=c[i]-10;
                c[i+1]=1;
            }
    }
    if(strlen(a)==strlen(b))
        if(c[i]==1)
            c[i]='1';
    if(strlen(a)>strlen(b))
    {
        if(c[i]==1)
        {
            for(;i<strlen(a);i++)
            {
                c[i]+=a[i];
                if(c[i]-'0'>=10)
                {
                    c[i]=c[i]-10;
                    c[i+1]=1;
                }
            }
            if(c[i-1]=='0')
                c[i]='1';
        }
        else
            for(;i<strlen(a);i++)
                c[i]=a[i];
    }
    if(strlen(b)>strlen(a))
    {
        if(c[i]==1)
        {
            for(;i<strlen(b);i++)
            {
                c[i]+=b[i];
                if(c[i]-'0'>=10)
                {
                    c[i]=c[i]-10;
                    c[i+1]=1;
                }
            }
            if(c[i]==1)
                c[i]='1';
        }
    else
        for(;i<strlen(b);i++)
            c[i]=b[i];
    }
}
int main()
{
    scanf("%s",a);
    scanf("%s",b);
    swap(a);
    swap(b);
    add(a,b);
    swap(c);
    printf("%s",c);
    return 0;
}

高精度减法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char a[1001],b[1001];
int a1[1001],b1[1001];
int c[1001];
int i,j,al,bl,l;
int main()
{
        scanf("%s",a);
        scanf("%s",b);
        al=strlen(a);
        bl=strlen(b);
        l=al>bl?al:bl;
        for(i=0;i<al;i++)
            a1[al-i-1]=a[i];
        for(i=0;i<bl;i++)
            b1[bl-i-1]=b[i];
        for(i=l-1;i>=0;i--)
        {
            if(al>bl || a1[i]>b1[i])
            {
                    for(j=0;j<l;j++){
                        c[j]=a1[j]-b1[j]+'0';
                        if(b1[j]==0)
                            c[j]-='0';
                    }
                    for(j=0;j<l-1;j++)
                        if(c[j]<'0')
                        {
                            c[j]+=10;
                            c[j+1]--;
                        }
                    while(c[l-1]=='0'&&l!=0)
                        l--;
                    for(j=l-1;j>=0;j--)
                        printf("%c",c[j]);
                    break;
            }
            if(al<bl||a1[i]<b1[i])
            {
                for(j=0;j<l;j++)
                {
                    c[j]=b1[j]-a1[j]+'0';
                    if(a1[j]==0)
                        c[j]-='0';
                }
                for(j=0;j<l-1;j++)
                    if(c[j]<'0')
                    {
                        c[j]+=10;
                        c[j+1]--;
                        if(c[j+1]=='0'&&j+1==l-1)
                            l--;
                    }
                while(c[l-1]=='0'&&l!=0)
                    l--;
                printf("-");
                for(j=l-1;j>=0;j--)
                    printf("%c",c[j]);
                break;
            }
        }
    return 0;
}

 

高精度乘法

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int jw,sum,ac,bc,k;
int a,b,ans[10000];
string A;
string B;
int main()
{
    cin>>A>>B;
    ac=A.size()-1;
    bc=B.size()-1;
    for(int i=0;i<=ac;i++)
    {
        a=A[ac-i]-'0';
        for(int j=0;j<=bc;j++)
        {
            k=i+j;
            b=B[bc-j]-'0';
            ans[k]+=a*b;
            if(ans[k]>=10)
            {
                ans[k+1]+=ans[k]/10;
                ans[k]%=10;
            }
        }
    }
    if(ans[k+1]>0)
        k++;
    for(int i=k;i>=0;i--)
        cout<<ans[i];
    return 0;
}


Square 【开方】:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
int l;
int work(int o,char *O,int I)
{
    char c,*D=O ;
    if(o>0)
    {
        for(l=0;D[l];D[l++]-=10)
        {
            D[l++]-=120;
            D[l]-=110;
            while(!work(0,O,l))
                D[l]+=20;
            putchar((D[l]+1032)/20);
        }
        putchar(10);
    }
    else
    {
        c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9;
        D[I]+=I<0 ? 0 : !(o=work(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10);
    }
    return o;
}
int main()
{
    char s[1200];
    s[0]='0';
    scanf("%s",s+1);
    if(strlen(s)%2==1)
        work(2,s+1,0);
    else
        work(2,s,0);
    return 0;
}

 

posted @ 2021-02-09 10:43  S_Curry  阅读(767)  评论(0编辑  收藏  举报