高精度算法

加法

#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("\n");
}
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;
}


posted @ 2017-09-23 21:38  lmjer  阅读(154)  评论(0编辑  收藏  举报