zoukankan      html  css  js  c++  java
  • 高精度加法、减法、乘法

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=100005;
    struct asd{
        int ans[maxn],len;
        bool jud;
        asd(){
            memset(ans,0,sizeof(ans));
            len=1;
            jud=0;
        }
        asd operator +(asd &A){
            asd B;
            B.len=max(len,A.len);
            for(int i=0;i<B.len;i++){
                B.ans[i]+=A.ans[i]+ans[i];
                if(B.ans[i]>=10){
                    B.ans[i]-=10;
                    B.ans[i+1]+=1;
                }
            }
            if(B.ans[B.len]) B.len++;
            return B;
        }
        asd operator -(asd &A) {
            asd B;
            bool jud=0;
            if(A.len>len) jud=1;
            else if(A.len==len){
                for(int i=len-1;i>=0;i--){
                    if(A.ans[i]>ans[i]){
                        jud=1;
                        break;
                    }
                    if(A.ans[i]<ans[i]) break;
                }
            }
            if(jud){
                B.len=A.len;
                for(int i=0;i<B.len;i++){
                    if(A.ans[i]>=ans[i]){
                        B.ans[i]=A.ans[i]-ans[i];
                    } else {
                        B.ans[i]=A.ans[i]-ans[i]+10;
                        A.ans[i+1]--;
                    }
                }
            } else {
                B.len=len;
                for(int i=0;i<B.len;i++){
                    if(ans[i]>=A.ans[i]){
                        B.ans[i]=ans[i]-A.ans[i];
                    } else {
                        B.ans[i]=ans[i]-A.ans[i]+10;
                        ans[i+1]--;
                    }
                }
            }
            B.jud=jud;
            return B;
        }
        asd operator *(asd &A){
            asd B;
            for(int i=0;i<A.len;i++){
                for(int j=0;j<len;j++){
                    B.ans[i+j]+=A.ans[i]*ans[j];
                }
            }
            for(int i=0;i<A.len;i++){
                for(int j=0;j<len;j++){
                    if(B.ans[i+j]>=10){
                        B.ans[i+j+1]+=B.ans[i+j]/10;
                        B.ans[i+j]%=10;
                    }
                }
            }
            B.len=A.len+len;
            return B;
        }
        void read(){
            char s[maxn];
            scanf("%s",s);
            int ll=strlen(s);
            for(int i=0;i<ll;i++) ans[i]=s[ll-i-1]-'0';
            len=ll;
            while(ans[len-1]==0 && len-1!=0) len--;
        }
        void write(){
            while(ans[len-1]==0 && len-1!=0) len--;
            if(jud==1) printf("-");
            for(int i=len-1;i>=0;i--){
                printf("%d",ans[i]);
            }
            printf("
    ");
        }
    };
    asd a,b,c;
    int main(){
        a.read();
        b.read();
        c=a*b;//乘法
        c=a+b;//加法
        c=a-b;//减法
        c.write();
        return 0;
    }
    
  • 相关阅读:
    常见树的总结
    《深入理解Java虚拟机》读书笔记(第三章)
    《Jave并发编程的艺术》学习笔记(1-2章)
    Java多线程与并发之面试常问题
    Morris遍历-如何用空间复杂度O(1)来遍历二叉树
    BFPRT算法
    Manacher
    maven基础
    play framework + sbt入门之环境搭建
    rancher部署kubernets集群
  • 原文地址:https://www.cnblogs.com/liuchanglc/p/13198203.html
Copyright © 2011-2022 走看看