• 高精度之+×÷


    以下是三种高精度算术的模版:

    高精度加法:

    string s="0123456789",s1,s2;
    int ss1[1005],ss2[1005],len;
    
    void dashu(string s1,int ss1[])
    {
        for(int i=s1.length()-1;i>=0;i--)
        {
            for(int j=0;j<10;j++)
            {
                if(s[j]==s1[i])
                    ss1[s1.length()-1-i]=j;
            }
        }
    }
    
    void dashu_add(int ss1[],int ss2[])
    {
        int len1=s1.length(),len2=s2.length();
        if(len1>len2)
            len=len1;
        else
            len=len2;
        for(int i=0;i<len;i++)
        {
            ss1[i]+=ss2[i];
            if(ss1[i]>=10)
            {
                ss1[i+1]+=ss1[i]/10;
                ss1[i]%=10;
            }
        }
        int l=-1;
        for(int i=len;i>=0;i--)
        {
            if(ss1[i]!=0)
            {
                l=i;
                break;
            }
        }
        if(l>=0)
        {
            for(;l>=0;l--)
                cout<<ss1[l];
        }
        else
            cout<<0;
    }

    相关题目链接:HDU 1002


    高精度乘法:

    void bignum_fac(int n)
    {
        int a[100000];
        int m=1,b,d,i,j;
        memset(a,0,sizeof(a));
        a[1]=1;
        for(i=2;i<=n;i++)
        {
            d=0;
            for(j=1;j<=m;j++)
            {
                b=a[j]*i+d;
                a[j]=b%100000;
                d=b/100000;
            }
            if(d)
            {
                a[++m]=d;
            }
        }
        cout<<a[m];
        for(j=m-1;j>0;j--)
        {
            printf("%05d",a[j]);
        }
        printf("
    ");
    }

    相关题目链接:HDU 1042


    高精度除法:

    char s[1005];
    char division[1005];//存储进行高精度除法的数据
    
    bool bignum_div(int x)
    {
        int tot=0,num=0;
        for(int i=0;s[i];i++)
        {
            num=num*10+s[i]-'0';
            division[tot++]=num/x+'0';
            num%=x;
        }
        division[tot]='';//利于进行strcpy()
        if(num==0) //有适合的除数
        {
            int i=0;
            while(division[i]=='0')
                i++;
            strcpy(s,division+i);//比如49->07,那么下一轮s就变成7,多余的i个0都除掉
            return true;
        }
        else return false;
    }
     相关题目链接:POJ 2325
  • 相关阅读:
    linux中断处理浅析
    linux页面回收浅析
    linux线程同步浅析
    剖析一个由sendfile引发的linux内核BUG
    比memcpy更快的内存拷贝
    linux内核SMP负载均衡浅析
    sscanf,snprintf
    mysql中实现longblob数据流式读写
    sscanf
    substr复制字符串的一部分
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5225004.html
Copyright © 2020-2023  润新知