0
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