高精度

加法:

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\n",ans);
        return 0;
    }
    else
    {
        if(cmp(s1,s2)>0)
        {
    
            jian(s1,s2,ans);
            printf("%s\n",ans);
            return 0;
        }
        else
        {
            printf("0\n");
            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\n");
    else
    {
        while(i<len)
        printf("%c",ans[i++]+48);
        printf("\n");
    }
    i=0;
    while(i<len&&s[i]=='0') i++;
    if(i>=len)  printf("0");
    else
    {
        while(i<len)
        printf("%c",s[i++]);
    }
}
View Code

 

posted @ 2019-11-14 10:24  VxiaohuanV  阅读(164)  评论(0编辑  收藏  举报