问题标题: 请求各位大佬讲一讲高精度的加减乘除!!

0
0
已解决
鲁天一
鲁天一
初级光能
初级光能

请各位大佬统一用以下格式进行回答

1.高精度加法:
思想
。。。。。。
核心代码
。。。。。。 

2.高精度减法:
思想
。。。。。。
核心代码
。。。。。。 

3.高精度乘法:
思想
。。。。。。
核心代码
。。。。。。 

4.高精度除法:
思想
。。。。。。
核心代码
。。。。。。 

 

否则

我的头脑会炸的

 


0
已采纳
丁振轩
丁振轩
资深光能
资深光能

加法:

定义 x[100000],y[100000],z[100000],t=1,jw=0,d=1;
    string a,b;
    输入>>a>>b;
    x[0]=a.size();
    y[0]=b.size();
    z[0]=max(x[0],y[0]);
    for(int i=x[0]-1;i>=0;i--)
    {
        x[t]=a[i]-'0';
        t++;
    }

   for(int i=y[0]-1;i>=0;i--)
    {
        y[d]=b[i]-'0';
        d++;
    }
    for(int i=1;i<=z[0];i++)
    {
        z[i]=x[i]+y[i]+jw;
        jw=z[i]/10;
        z[i]=z[i]%10;
    }
    if(jw)
    {
        z[0]++;
        z[z[0]]=jw;
    }
    for(int i=z[0];i>=1;i--)
    输出<<z[i];

减法:

定义 a[2000],b[2000],c[2000],lena,lenb,lenc,i;
    char n[2000],n1[2000],n2[2000];
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    gets(n1); 
    gets(n2);
    if (strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2)&&strcmp(n1,n2)<0))  
    {
        strcpy(n,n1);
        strcpy(n1,n2);
        strcpy(n2,n);
        输出<<"-"; 
    }
    lena=strlen(n1);lenb=strlen(n2);
    for (i=0;i<=lena-1;i++) a[lena-i]=n1[i]-'0';
    for (i=0;i<=lenb-1;i++) b[lenb-i]=n2[i]-'0';
    i=1;
    while (i<=lena)
    {
        if (a[i]<b[i])
        {
            a[i]+=10;
            a[i+1]--;
        }
        c[i]=a[i]-b[i]; 
        i++;
    }
    lenc=i;
    for (i=lenc;i>=1;i--)
        if ((c[i]==0)&&(lenc>1)) lenc--;else break; 
    for (i=lenc;i>=1;i--) cout<<c[i];
    输出<<endl;

头文件:

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>

乘法:

函数外定义:

string sa,sb,st;
定义 la,lb,lc,tla,tlb,t;
bool isuselesszero=true;
vector <int> a,b,c;
输入>>sa>>sb;
    if(sa[0]=='0' || sb[0]=='0') {cout<<0; return 0;}
    la=sa.length(); lb=sb.length();
    if(la>lb){swap(sa,sb); la=sa.length(); lb=sb.length();}
    lc=max(la,lb); tla=la; tlb=lb;
    reverse(sa.begin(),sa.end()); reverse(sb.begin(),sb.end());
    while(tla<lc){sa+='0'; tla=sa.length();}
    while(tlb<lc){sb+='0'; tlb=sb.length();}
    for(int i=0;i<1000000;i++) c.push_back(0);
    for(int i=0;i<lc;i++){a.push_back((sa[i]-'0')); b.push_back((sb[i]-'0'));}
    for(int i=0;i<lb;i++){
        for(int j=0;j<la;j++){
            c[i+j]+=a[j]*b[i];
            if(c[i+j]>=10){
                c[i+j+1]+=c[i+j]/10;
                c[i+j]%=10;
            }
        }
    }
    reverse(c.begin(),c.end());
    for(int i=0;i<1000000;i++){
        if(isuselesszero&&c[i]==0) continue;
        if(c[i]!=0) isuselesszero=false;
        if(c[i]<10) cout<<c[i];
        else{
            c[i-1]=c[i]/10;
            c[i]%=10;
            输出<<c[i];
        }

头文件:

#include <cstdio>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

除法:

头文件:

#include <iostream>

#include <string>

#include <cstring>

#include <cstdio>

using namespace std;

#define DIGIT 4

#define DEPTH 10000

#define MAX 30000
typedef int bignum_t[MAX+1];

int read(bignum_t a,istream& is=cin){

char buf[MAX*DIGIT+1],ch;

定义 i,j;

memset((void*)a,0,sizeof(bignum_t));

if (!(is>>buf)) return 0;

for (a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)

ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch;

for (a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');

for (i=1;i<=a[0];i++)

for (a[i]=0,j=0;j<DIGIT;j++)

a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0';

for (;!a[a[0]]&&a[0]>1;a[0]--);

return 1;

}

void write(const bignum_t a,ostream& os=cout){

int i,j;

for (os<<a[i=a[0]],i--;i;i--)

for (j=DEPTH/10;j;j/=10)

os<<a[i]/j%10;

}

void sub(bignum_t a,const bignum_t b,const int c,const int d){

int i,O=b[0]+d;

for (i=1+d;i<=O;i++)

if ((a[i]-=b[i-d]*c)<0)

a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH;

for (;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);

for (;!a[a[0]]&&a[0]>1;a[0]--);

}

int comp(const bignum_t a,const int c,const int d,const bignum_t b){

int i,t=0,O=-DEPTH*2;

if (b[0]-a[0]<d&&c)

return 1;

for (i=b[0];i>d;i--){

t=t*DEPTH+a[i-d]*c-b[i];

if (t>0) return 1;

if (t<O) return 0;

}

for (i=d;i;i--){

t=t*DEPTH-b[i];

if (t>0) return 1;

if (t<O) return 0;

}

return t>0;

}

void div(bignum_t c,bignum_t a,const bignum_t b){

int h,l,m,i;

memset((void*)c,0,sizeof(bignum_t));

c[0]=(b[0]<a[0]+1)?(a[0]-b[0]+2):1;

for (i=c[0];i;sub(a,b,c[i]=m,i-1),i--)

for (h=DEPTH-1,l=0,m=(h+l+1)>>1;h>l;m=(h+l+1)>>1)

if (comp(b,m,i-1,a)) h=m-1;

else l=m;

for (;!c[c[0]]&&c[0]>1;c[0]--);

c[0]=c[0]>1?c[0]:1;

}

int main()

{

bignum_t a,b,c;

read(a);

read(b);

div(c,a,b);

write(c);

输出<<endl;

write(a);

输出<<endl;

求采纳。

1
王欣怡
王欣怡
新手光能
新手光能
加法
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int w[1000010],a[1000010],b[1000010];
void he()
{
    w[0]=max(a[0],b[0]);
    int jw=0,h;
    for(int i=1;i<=w[0];i++)
    {
        h=a[i]+b[i]+jw;
        w[i]=h%10;
        jw=h/10;
    }
    if(jw!=0)
    {
        w[0]++;
        w[w[0]]=jw;
    }
}
int main()
{
    char s1[1000010],s2[1000010];
    cin>>s1>>s2;
    a[0]=strlen(s1);
    b[0]=strlen(s2);
    for(int i=1;i<=a[0];i++)
        a[i]=s1[a[0]-i]-'0';
    for(int i=1;i<=b[0];i++)
        b[i]=s2[b[0]-i]-'0';
    he();   
    for(int i=w[0];i>=1;i--)cout<<w[i];
    return 0;
} 

 

 

 

减法
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int c[1000010],a[1000010],b[1000010];
void jian()
{
    c[0]=a[0];
    for(int i=1;i<=c[0];i++)
    {
        if(a[i]<b[i])
        {
            a[i+1]--;
            a[i]+=10;
        }
        c[i]=a[i]-b[i];
    }
    while(c[c[0]]==0) c[0]--;
}
int main()
{
    char s1[1000010],s2[1000010];
    cin>>s1>>s2;
    a[0]=strlen(s1);
    b[0]=strlen(s2);
    for(int i=1;i<=a[0];i++)
        a[i]=s1[a[0]-i]-'0';
    for(int i=1;i<=b[0];i++)
        b[i]=s2[b[0]-i]-'0';
    jian(); 
    for(int i=c[0];i>=1;i--)cout<<c[i];
    return 0;
}

 

 

 

乘法
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int w[1000010],a[1000010],b[1000010];
void he()
{
    int jw;
    for(int i=1;i<=a[0];i++)
    {
        jw=0;
        for(int j=1;j<=b[0];j++)
        {
            w[i+j-1]+=a[i]*b[j]+jw;
            jw=w[i+j-1]/10;
            w[i+j-1]%=10;
        }
        w[i+b[0]]+=jw;
    }
    w[0]=a[0]+b[0];
    while(w[w[0]]==0&&w[0]!=1)w[0]--;
}
int main()
{
    char s1[1000010],s2[1000010];
    cin>>s1>>s2;
    a[0]=strlen(s1);
    b[0]=strlen(s2);
    for(int i=1;i<=a[0];i++)
        a[i]=s1[a[0]-i]-'0';
    for(int i=1;i<=b[0];i++)
        b[i]=s2[b[0]-i]-'0';
    he();   
    for(int i=w[0];i>=1;i--)cout<<w[i];
    return 0;
} 

 

 

除法没学,翻书

 

求采纳

0
0
王远哲
王远哲
修练者
修练者

大神来也!!!!!!!!!!!!!!!!!!!!!

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
#define DIGIT   4
#define DEPTH   10000
#define MAX     30000
typedef int bignum_t[MAX+1];
int read(bignum_t a,istream& is=cin){
    char buf[MAX*DIGIT+1],ch;
    int i,j;
    memset((void*)a,0,sizeof(bignum_t));
    if (!(is>>buf)) return 0;
    for (a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)
        ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch;
    for (a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');
    for (i=1;i<=a[0];i++)
        for (a[i]=0,j=0;j<DIGIT;j++)
            a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0';
    for (;!a[a[0]]&&a[0]>1;a[0]--);
    return 1;
}
void write(const bignum_t a,ostream& os=cout){
    int i,j;
    for (os<<a[i=a[0]],i--;i;i--)
        for (j=DEPTH/10;j;j/=10)
            os<<a[i]/j%10;
}
void sub(bignum_t a,const bignum_t b,const int c,const int d){
    int i,O=b[0]+d;
    for (i=1+d;i<=O;i++)
        if ((a[i]-=b[i-d]*c)<0)
            a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH;
    for (;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
    for (;!a[a[0]]&&a[0]>1;a[0]--);
}
int comp(const bignum_t a,const int c,const int d,const bignum_t b){
    int i,t=0,O=-DEPTH*2;
    if (b[0]-a[0]<d&&c)
        return 1;
    for (i=b[0];i>d;i--){
        t=t*DEPTH+a[i-d]*c-b[i];
        if (t>0) return 1;
        if (t<O) return 0;
    }
    for (i=d;i;i--){
        t=t*DEPTH-b[i];
        if (t>0) return 1;
        if (t<O) return 0;
    }
    return t>0;
}

void div(bignum_t c,bignum_t a,const bignum_t b){
    int h,l,m,i;
    memset((void*)c,0,sizeof(bignum_t));
    c[0]=(b[0]<a[0]+1)?(a[0]-b[0]+2):1;
    for (i=c[0];i;sub(a,b,c[i]=m,i-1),i--)
        for (h=DEPTH-1,l=0,m=(h+l+1)>>1;h>l;m=(h+l+1)>>1)
            if (comp(b,m,i-1,a)) h=m-1;
            else l=m;
    for (;!c[c[0]]&&c[0]>1;c[0]--);
    c[0]=c[0]>1?c[0]:1;
}
int main()
{
    bignum_t a,b,c;
    read(a);
    read(b);
    div(c,a,b);
    write(c);
    cout<<endl;
    write(a);
    cout<<endl;
    return 0;
} 

别举报!!!

我跪下了!!!!!!!!!!!!!!!!!!!!!!!!!

王远哲在2018-10-23 18:45:52追加了内容

打算把核心代码给弄上去的,结果“确定”害了我,呜呜呜呜呜!!

0
我要回答