zoukankan      html  css  js  c++  java
  • 高精度算法

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

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

    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;  
    }  

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

  • 相关阅读:
    NC6开发配置流程
    触发器
    U8采购订单联查采购入库单
    sqlserver 游标
    windows服务 定时任务
    ORACLE 导入导出
    laravel 在模板中使select保存的值下单选中
    laravel 中request
    laravel中 url() route() URL::asset()
    laravel 中 后台管理的 路由设计
  • 原文地址:https://www.cnblogs.com/Alarak26/p/8503677.html
Copyright © 2011-2022 走看看