高精度算法

高精度算法,就是利用竖式的计算方法,一位位的计算。

总体来说有以下几点需要注意:

1 不要忘记删除前导0

2 用字符型读入并将其-48转为int型存储

3 不要忘记进位退位

4 高精减的时候不要忘记比较大小

高精度加法

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char a1[100],b1[100];
    int a[100],b[100],c[100];
    int a1_len,b1_len,lenc,i,x;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    gets(a1);
    gets(b1); //输入加数与被加数
    a1_len=strlen(a1);
    b1_len=strlen(b1);
    for (i=0;i<=a1_len-1;i++)
    {
        a[a1_len-i]=a1[i]-48; //将操作数放入a数组
    }
    for (i=0;i<=b1_len-1;i++)
    {
        b[b1_len-i]=b1[i]-48; //将操作数放入b数组
    }
    lenc =1;
    x=0;
    while(lenc <=a1_len || lenc <=b1_len)//相加并进位 
    {
        c[lenc]=a[lenc]+b[lenc]+x; 
        x=c[lenc]/10;   
        c[lenc]=c[lenc]%10;     
        lenc++;     
    }
    c[lenc]=x;
    if (c[lenc]==0)
    {
        lenc--; //去除前导0 
    }
    for (i=lenc;i>=1;i--)
    {
        cout<<c[i]; //输出结果
    }
    cout<<endl;
    return 0;
}

高精度减法

#include<bits/stdc++.h>
using namespace std;  
bool cmp(char a[],char b[])  
{  
    if(strlen(a)>strlen(b))  
        return true;  
    if(strlen(a)<strlen(b))  
        return  false;  
    if(strlen(a)==strlen(b))  
    {  
        if(strcmp(a,b)>0)  
            return true;  
        else  
            return false;  
    }  
}  
int main()  
{  
    char a[1000],b[1000];  
    int  a1[1000]={0},b1[1000]={0},c[1000]={0},i,len1,len2,l;  
    scanf("%s %s",a,b);  
    len1=strlen(a);  
    len2=strlen(b);  
    l=len1>len2?len1:len2;  
    for(i=0;i<len1;i++)  
        a1[i]=a[len1-1-i]-'0';  
    for(i=0;i<len2;i++)  
        b1[i]=b[len2-1-i]-'0';  
    if(cmp(a,b))  
    {  
        for(i=0;i<l;i++)  
        {  
            c[i]+=a1[i]-b1[i];  
            if(c[i]<0)  
            {  
                c[i+1]--;  
                c[i]+=10;  
            }  
        }  
        if(c[l]<0)  
            c[l]--;  
        for(i=l-1;i>=0;i--)  
            cout<<c[i];  
        cout<<endl;  
    }  
    else  
    {  
        for(i=0;i<l;i++)  
        {  
            c[i]+=b1[i]-a1[i];  
            if(c[i]<0)  
            {  
                c[i+1]--;  
                c[i]+=10;  
            }  
        }  
        if(c[l]<0)  
            l--;  
        cout<<"-";  
        for(i=l-1;i>=0;i--)  
            cout<<c[i];  
        cout<<endl;  
    }  
}  

高精度乘法

#include<bits/stdc++.h>
using namespace std;  
const int maxn=4005;  
string mul(string str1,string str2);  
int main()
{  
    string a,b;  
    cin>>a>>b;  
    cout<<mul(a,b)<<endl;  
    return 0;  
}  
string mul(string str1,string str2)
{  
    int len1=str1.size();  
    int len2=str2.size();  
    string str="";  
    int i,j,a[maxn],b[maxn],c[maxn];  
    for(i=0;i<len1;i++)
        a[i]=int(str1[len1-1-i]-'0');
    for(i=0;i<len2;i++)
        b[i]=int(str2[len2-1-i]-'0');  
    for(i=0;i<len1;i++) 
        for(j=0;j<len2;j++)
        {  
            c[i+j]+=a[i]*b[j];  
            c[i+j+1]+=c[i+j]/10;  
            c[i+j]=c[i+j]%10;  
        }  
    int len3=len1+len2;  
    while(len3>1&&c[len3-1]==0)
        len3--;  
    for(i=0;i<len3;i++)
        str=char(c[i]+'0')+str;    
    return str;  
}  

高精度除法:然而并不常用。

posted @ 2018-03-04 05:12  Coool  阅读(252)  评论(0编辑  收藏  举报