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

    加法

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int a[1000],b[1000],ans[1000];
    void read(int *a,int &len){
        char strl[1000];
        scanf("%s",strl);
        len=strlen(strl);
        int top=len-1;
        for (int i=0;i<len;i++) a[top--]=strl[i]-'0';
    }
    int main(){
        int len1;
        int len2;
        read(a,len1);
        read(b,len2);
        int len;
        len=max(len1,len2);
        int c=0;
        for (int i=0;i<=len;i++){
            ans[i]=a[i]+b[i]+c;
            if(ans[i]>9) {
                    c=ans[i]/10;
                    ans[i]%=10;
            }
            else c=0;
        }
        while(ans[len]!=0) len++;
        for (int i=len-1;i>=0;i--)
            printf("%d",ans[i]);
    return 0;
    }
     减法
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int a[10009],b[10009],ans[10009];
    char strl1[10009],strl2[10009];
    int main(){
        int len1;
        int len2;
         scanf("%s",strl1);
         scanf("%s",strl2);
        len1=strlen(strl1);
        len2=strlen(strl2);
        if(len1>len2){
            int top=len1-1;
            for (int i=0;i<len1;i++)
            a[top--]=strl1[i]-'0';
            top=len2-1;
            for (int i=0;i<len2;i++)
            b[top--]=strl2[i]-'0';
        }
       else if(len1==len2){
            if(strcmp(strl1,strl2)>0){
            int top=len1-1;
            for (int i=0;i<len1;i++)
            a[top--]=strl1[i]-'0';
            top=len2-1;
            for (int i=0;i<len2;i++)
            b[top--]=strl2[i]-'0';
           }
           else if(strcmp(strl1,strl2)==0)
           {
               printf("0");
               return 0;
           }
           else {
            int top=len1-1;
            for (int i=0;i<len1;i++)
            b[top--]=strl1[i]-'0';
            top=len2-1;
            for (int i=0;i<len2;i++)
            a[top--]=strl2[i]-'0';
            printf("-");
           }
        }
        else {
             int top=len1-1;
            for (int i=0;i<len1;i++)
            b[top--]=strl1[i]-'0';
            top=len2-1;
            for (int i=0;i<len2;i++)
            a[top--]=strl2[i]-'0';
            printf("-");
        }
        int len;
        len=max(len1,len2);
        int c=0;
        for (int i=0;i<=len;i++){
            ans[i]=a[i]-b[i]-c;
            if(ans[i]<0) {
                    c=1;
                    ans[i]+=10;
            }
            else c=0;
        }
        while(ans[len-1]==0&&len>1) len--;
        for (int i=len-1;i>=0;i--)
            printf("%d",ans[i]);
    return 0;
    }
    乘法
    #include<stdio.h>
    #include<string.h>
    int a[3005],b[3005],ans[6000];
    void read(int *A,int &len){
        char strl1[3005];
       scanf("%s",strl1);
       len=strlen(strl1);
       int top=len-1;
       for (int i=0;i<len;i++)
        A[top--]=strl1[i]-'0';
    }
    int main(){
       int len1;
       int len2;
       read(a,len1);
       read(b,len2);
       if(a[len1-1]==0||b[len2-1]==0) {
        printf("0");
        return 0;
       }
       for (int i=0;i<len1;i++){
        for (int j=0;j<len2;j++){
            ans[i+j]+=a[i]*b[j];
        }
       }
       int len=len1+len2-1;
       for (int i=0;i<len;i++){
        if(ans[i]>9) {
            ans[i+1]+=ans[i]/10;
            ans[i]%=10;
        }
       }
       while(ans[len]) len++;
       for (int i=len-1;i>=0;i--)
        printf("%d",ans[i]);
    return 0;
    }
    除法
    #include<stdio.h>
    #include<string.h>
    const int maxn=5005;
    int a[maxn],b[maxn],c[maxn],ans[maxn];
    void read(int *A){
       char strl1[maxn];
       int top;
       scanf("%s",strl1);
       A[0]=strlen(strl1);
       top=A[0]+1;
       for (int i=0;i<A[0];i++)
        A[--top]=strl1[i]-'0';
    }
    bool check(){
        if(c[0]>b[0]) return true;
        if(c[0]<b[0]) return false;
        for (int i=c[0];i>=1;i--)
            {
                if(c[i]<b[i]) return false;
            else if(c[i]>b[i]) return true;
            }
        return true;
    }
    void jian(){
       int f=0;
       int t=0;
       for (int i=1;i<=c[0];i++){
        c[i]-=b[i]+t;
        if(c[i]<0) {
            c[i]+=10;
            t=1;
        }
        else t=0;
       }
       while(c[c[0]]==0&&c[0]>1) c[0]--;
       if(c[0]==1&&c[1]==0) c[0]--;
    }
    void print(int *A){
       for (int i=A[0];i>=1;i--)
        printf("%d",A[i]);
       printf("
    ");
    }
    int main(){
        read(a);
        read(b);
        c[0]=0;
        for (int i=a[0];i>=1;i--){
            for (int j=c[0];j>=1;j--) c[j+1]=c[j];
            c[1]=a[i];
            c[0]++;
            if(c[1]==0&&c[0]==1) c[0]--;
            while(check()){
                jian();
                ans[i]++;
            }
        }
        ans[0]=a[0];
        while(ans[0]>1&&ans[ans[0]]==0) ans[0]--;
        print(ans);
        if(c[0]==0) printf("0");
        while(c[0]>1&&c[c[0]]==0) c[0]--;
        print(c);
     
     return 0;
    }


  • 相关阅读:
    路径
    JSTL-3
    JSTL-2
    JSTL-1
    EL和JSTL的关系
    Mybatis控制台打印SQL语句的两种方式
    centOS7安装JDK
    centOS7下安装GUI图形界面
    centOS7配置IP地址
    Office2016专业增强版永久激活
  • 原文地址:https://www.cnblogs.com/lmjer/p/7582752.html
Copyright © 2011-2022 走看看