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

    加法:

    void r_move(char *s)
    {
        for(ri i=strlen(s)-1,j=M-1;i>=0;j--,i--)
        {
            s[j]=s[i]-48;
            s[i]=0;
        }
    }
    void l_move(char *s)
    {
        int i=0;
        while(s[i]==0) i++;
        for(ri j=0;i<=M-1;i++,j++)
        {
            s[j]=s[i]+48;
            s[i]=0;
        }
    }
    void add(char *s1,char *s2,char *ans)
    {
        int len1=strlen(s1);
        int len2=strlen(s2);
        int len=max(len1,len2);
        r_move(s1);
        r_move(s2);
        for(ri i=M-1;i>=M-len;i--)
        {
            ans[i]+=s1[i]+s2[i];
            ans[i-1]+=ans[i]/10;
            ans[i]=ans[i]%10;
        }
        l_move(ans);
    }
    View Code

    减法:用 自己写的 cmp

    #include <bits/stdc++.h>
    using namespace std;
    const int M = 10005;
    const int N = 10005;
    #define ri register int
    char s1[M],s2[M],ans[M];
    void r_move(char *s)
    {
        for(ri i=M-1,j=strlen(s)-1;j>=0;j--,i--)
        {
            s[i]=s[j]-48;
            s[j]=0;
        }
    }
    void l_move(char *s)
    {
        int i=0;
        while(ans[i]==0) i++;
        for(ri j=0;i<=M-1;i++,j++)
        {
            ans[j]=ans[i]+48;
            ans[i]=0;
        }
    }
    void jian(char *s1,char *s2,char *ans)
    {
        int len1=strlen(s1);
        int len2=strlen(s2);
        int len=max(len1,len2);
        r_move(s1);
        r_move(s2);
        for(ri i=M-1;i>=M-len;i--)
        {
            ans[i]+=s1[i]-s2[i];
            if(ans[i]<0) ans[i]+=10,ans[i-1]-=1;
        }
        l_move(ans);
    }
    int cmp(char *s1,char *s2)
    {
        if(strlen(s1)<strlen(s2)) return -1;
        if(strlen(s1)>strlen(s2)) return 1;
        return strcmp(s1,s2);
    }
    int main(){
        scanf("%s%s",s1,s2);
        if(cmp(s1,s2)<0)
        {
            jian(s2,s1,ans);
        
            printf("-%s
    ",ans);
            return 0;
        }
        else
        {
            if(cmp(s1,s2)>0)
            {
        
                jian(s1,s2,ans);
                printf("%s
    ",ans);
                return 0;
            }
            else
            {
                printf("0
    ");
                return 0;
            }
        }
    }
    View Code

    乘法:在左移的时候注意 i==j的情况 i

    void l_move(char *ans,int len)
    {
         int i=0;
        while(ans[i]==0&&i<len) i++;
        if(i>=len) memset(ans,0,sizeof ans),ans[0]='0';
        else
        {
            for(ri j=0;i<len;i++,j++)
            {
              ans[j]=ans[i]+48;
              if(j!=i) ans[i]=0;
            }
        }
    }
    void mul(char *s1,char *s2,char *ans)
    {
        for(ri i=0;i<strlen(s1);i++)
        {
            for(ri j=0;j<strlen(s2);j++)
            {
              ans[i+j+1]+=(s1[i]-48)*(s2[j]-48);
            }
            for(ri j=strlen(s1)+strlen(s2);j>0;j--)
            ans[j-1]+=ans[j]/10,ans[j]=ans[j]%10;
        }
        l_move(ans,strlen(s1)+strlen(s2));
        
    }
    View Code

    除法:

    int mycmp(char *s,char *s2,int star,int end)
    {
        int len2=strlen(s2);
        int len=end-star+1;
        if(len>len2) return 1;
        else if(len<len2) return -1;
        else return strncmp(s+star,s2,len2);
    }
    void _chu(char *s,char *s2,char *ans)
    {
        int star=0;
        int len=strlen(s);
        int len2=strlen(s2);
        while(1)
        {
            int end=star+len2-1;
            while(end<len&&mycmp(s,s2,star,end)<0) end++;
            if(end>=len) break;
            while(mycmp(s,s2,star,end)>=0) //end<len&&
            {
                for(int i=end,j=len2-1;j>=0;j--,i--)
                {
                    if(s[i]-s2[j]<0)
                    {
                        s[i]+=10;
                        s[i-1]--;
                    }
                    s[i]=s[i]-s2[j]+48;
                }
                ans[end]++;
                while(star<len&&s[star]=='0') star++;
            }   
        }
        int i=0;
        while(i<len&&ans[i]==0) i++;
        if(i>=len) printf("0
    ");
        else
        {
            while(i<len)
            printf("%c",ans[i++]+48);
            printf("
    ");
        }
        i=0;
        while(i<len&&s[i]=='0') i++;
        if(i>=len)  printf("0");
        else
        {
            while(i<len)
            printf("%c",s[i++]);
        }
    }
    View Code
  • 相关阅读:
    Opennebula4.2管理端和节点SSH模式的安装配置
    shell操作mysql之增删改查
    Linux常用服务部署与优化之NFS篇
    Linux常用服务部署与优化之Samba篇
    sql编程小结
    mysql5.7.11编译安装以及修改root密码小结
    基于centOS6.7搭建LAMP(httpd-2.4.18+mysql-5.5.47+php-5.6.16)环境
    php实现文件上传下载功能小结
    zabbix搭建
    mysql主从复制
  • 原文地址:https://www.cnblogs.com/Lamboofhome/p/11855215.html
Copyright © 2011-2022 走看看