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;
    }
    
  • 相关阅读:
    迭代器和生成器
    New test
    MySQL笔记整理
    Python基础数据类型
    Python基础
    Python入门知识
    Linux / MacOS 下Redis 安装、配置和连接
    NuGet的使用心得
    简单工厂模式和策略模式的区别与结合
    NuGet的使用和服务搭建
  • 原文地址:https://www.cnblogs.com/liuchanglc/p/13198203.html
Copyright © 2011-2022 走看看