华师一附中OI组
标题:
20210811网课第一题 高精度除法
[打印本页]
作者:
admin
时间:
2021-8-11 09:09
标题:
20210811网课第一题 高精度除法
输入两个正整数,都不超过1000位,求他们的商和余数。
比如输入100 3 输出33 1
比如输入1000 10 输出100 0
作者:
admin
时间:
2021-8-11 09:09
#include <bits/stdc++.h>
using namespace std;
string a,b,c,r,b09[10],ta;
bool isbig(string x,string y) // 判断大小
{
bool b1=x.size()>y.size();
bool b2=(x.size()==y.size()) && (x>y);
return b1||b2;
}
string add(string x,string y)
{
if (isbig(y,x)) swap(x,y);
int lx=x.size(),ly=y.size();
for (int p=1; p<=lx-ly; p++) y="0"+y; // 短的前面添0
int j=0;
string z=""; // 一定要有初值
for(int p=lx-1; p>=0; p--) // 从右往左加
{
int x1=x[p]-'0',x2=y[p]-'0';
int x3=x1+x2+j;
if (x3>9)
{
x3-=10;
j=1;
}
else j=0;
z=char('0'+x3)+z; //右左
}
if(j==1) z="1"+z;
return z;
}
string sub(string x,string y)
{
int lx=x.size(),ly=y.size();
for (int p=1; p<=lx-ly; p++) y='0'+y; // 短的前面添0
int j=0;
string z=""; // 一定要有初值
for(int p=lx-1; p>=0; p--) // 从右往左加
{
int x3=x[p]-y[p]-j;
if (x3<0)
{
x3+=10;
j=1;
}
else j=0;
z=char('0'+x3)+z; //右左
}
while (z[0]=='0' && z.size()>1) z.erase(0,1); // 去掉最高位的0
return z;
}
void getb09()
{
b09[0]='0',b09[1]=b;
for (int i=2; i<=9; i++) b09[i]=add(b09[i-1],b);
}
int main()
{
cin>>a>>b;
int la=a.size(),lb=b.size();
ta=r=c="";
getb09();
//CKECK for (int i=0;i<=9;i++) cout<<b09[i]<<endl;
r=a.substr(0,lb-1); // 找到同样长度的 再来
for (int p=lb-1; p<=la-1; p++) // 从左往右除
{
ta=r+a[p]; //添1位成为新的被除数
int k=9;
while (isbig(b09[k],ta)) k--; // 试商
c=c+char('0'+k); // 左右
r=sub(ta,b09[k]);
}
while (c[0]=='0' && c.size()>1) c.erase(0,1); // 去掉最高位的0
while (r[0]=='0' && r.size()>1) r.erase(0,1); // 去掉最高位的0
cout<<c;
//<<' '<<r;
return 0;
}
/*
10 3
12345 5
123456789987654321 123456789
999999999999999999999999999999999999 99999999999999999999
*/
复制代码
作者:
孔某某某
时间:
2021-8-11 09:42
#include <bits/stdc++.h>
using namespace std;
int a[100010],b[100010],c[100010],d,i;
void init(int a[])//初始化
{
string s;
cin>>s;
a[0]=s.length();
for (i=1; i<=a[0]; i++)
a[i]=s[a[0]-i]-'0';
}
void print(int a[])
{
int i;
if (a[0]==0)
{
cout<<0<<endl;
return;
}
for (i=a[0]; i>0; i--)
cout<<a[i];
return ;
}//输出
int compare (int a[],int b[])
{
int i;
if (a[0]>b[0])
return 1;
if (a[0]<b[0])
return -1;
for (i=a[0]; i>0; i--)
{
if (a[i]>b[i])
return 1;
if (a[i]<b[i])
return -1;
}
return 0;
}
void jian(int a[],int b[])//减法
{
int flag,i;
flag=compare(a,b);
if (flag==0)
{
a[0]=0;
return ;
}
if (flag==1)
{
for (i=1;i<=a[0];i++)
{
if (a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while (a[0]>0&&a[a[0]]==0)
a[0]--;
return ;
}
}
void numcpy(int p[],int q[],int det)
{
for (int i=1;i<=p[0];i++)
q[i+det-1]=p[i];
q[0]=p[0]+det-1;
} //对齐位数
void chugao(int a[],int b[],int c[])
{
int i,tmp[100010];
c[0]=a[0]-b[0]+1;
for (i=c[0];i>0;i--)
{
memset(tmp,0,sizeof(tmp));
numcpy(b,tmp,i);
while (compare(a,tmp)>=0)
{
c[i]++;
jian(a,tmp);
}
}
while (c[0]>0&&c[c[0]]==0)
c[0]--;
return ;
}
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
init(a);
init(b);
chugao(a,b,c);
print(c);
cout<<" ";
print(a);
return 0;
}
作者:
admin
时间:
2021-8-11 11:28
孔同学,很好!但是我真的墙裂不建议c[0]表示长度。其实你可以用一个结构体、
作者:
非液化
时间:
2021-8-11 16:10
#include<bits/stdc++.h>
using namespace std;
string a,b,s,b09[10],outPut;//输入a,b
int la,lb;
int isBig(string x, string y)
{
int lx=x.size();
int ly=y.size();
if(lx>ly||(lx==ly&&x>y))
return 0;
else return 1;
}
string highAdd(string x,string y)//高精度加法
{
int lx=x.size();
int ly=y.size();
string t="";//临时存储
if(isBig(x,y)==0)//小的前面添0
{
for(int i=1;i<=lx-ly;i++)
y="0"+y;
}
else
{
for(int i=1;i<=ly-lx;i++)
x="0"+x;
}
int j=0;//进位
for(int i=max(lx,ly)-1;i>=0;i--)
{
int n=x[i]-'0'+y[i]-'0'+j;
if(n>9)
{
j=1;
n-=10;
}
else j=0;
t=char(n+'0')+t;
}
if(j!=0)
{
t=char(j+'0')+t;
}
return t;
}
void getb09()//
{
b09[0]='0';
b09[1]=b;
for(int i=2;i<=9;i++)
{
b09[i]="";
b09[i]=highAdd(b09[i-1],b);
}
}
string highSub(string x,string y)
{
int lx=x.size();
int ly=y.size();
string t="";//临时存储
for(int i=1;i<=lx-ly;i++)
y="0"+y;
int j=0;//退位
for(int i=lx-1;i>=0;i--)
{
int n=x[i]-y[i]+j;
if(n<0)
{
j=-1;
n+=10;
}
else j=0;
t=char(n+'0')+t;
}
while(t[0]=='0'&&t.size()>0)
{
t.erase(0,1);
}
return t;
}
void highDiv()
{
s=a.substr(0,lb);
outPut="";
for(int i=lb-1;i<la;i++)
{
int j=9;
while((isBig(b09[j],s)==0)&&j!=0)//试商
{
j--;
}
outPut=outPut+char(j+'0');
s=highSub(s,b09[j])+a[i+1];
}
}
int main()
{
cin>>a>>b;
la=a.size();
lb=b.size();
getb09();
highDiv();
while(outPut[0]=='0'&&outPut.size()!=0)
{
outPut.erase(0,1);//最高位去0
}
cout<<outPut<<endl<<s;
return 0;
}
复制代码
作者:
651979223
时间:
2021-8-11 16:36
#include<bits/stdc++.h>
using namespace std;
string a,b,c,d,g[10],a1;//a被除数,b除数,c商,d余数 ,a1过程被除数
bool daxiao(string x,string y)
{
bool b1,b2;
int lx=x.size(),ly=y.size();
b1=lx>ly;
b2=(lx==ly)&&(x>y);
return b1||b2;
}
string jia(string x,string y)
{
string z="";int flag=0;//进位标识
if(daxiao(y,x)) swap(x,y);
int lx=x.size(),ly=y.size();
for(int p=0;p<lx-ly;p++)
y='0'+y;//补0
for(int j=lx-1;j>=0;j--)
{
int x1=x[j]-'0',y1=y[j]-'0',z1=x1+y1+flag;
if(z1>9)
{
z1%=10;
flag=1;
}
else flag=0;
z=char('0'+z1)+z;
}
if(flag==1) z='1'+z;
return z;
}
string jian(string x,string y)
{
string z="";int flag=0;//退位标识
int lx=x.size(),ly=y.size();
for(int p=0;p<lx-ly;p++)
y='0'+y;//补0
for(int j=lx-1;j>=0;j--)
{
int x1=x[j]-'0',y1=y[j]-'0',z1=x1-y1-flag;
if(z1<0)
{
z1+=10;
flag=1;
}
else flag=0;
z=char('0'+z1)+z;
}
while (z[0]=='0' && z.size()>1) z.erase(0,1);
return z;
}
void chuprocess()//试商函数
{
g[0]='0';g[1]=b;
for(int i=2;i<=9;i++) g[i]=jia(g[i-1],b);
}
int main()
{
cin>>a>>b;
int la=a.size(),lb=b.size();
a1=c=d="";
chuprocess();
d=a.substr(0,lb-1);
for (int p=lb-1; p<=la-1; p++)
{
a1=d+a[p];
int s=9;
while(daxiao(g[s],a1)==1) s--;
c=c+char(s+'0');
d=jian(a1,g[s]);
}
while(c[0]=='0' && c.size()>1) c.erase(0,1);
while(d[0]=='0'&&d.size()>1) d.erase(0,1);
cout<<c<<" "<<d;
return 0;
}
复制代码
作者:
demonlover
时间:
2021-8-11 18:28
#include <bits/stdc++.h>
using namespace std;
string sa,sb,c="",r,b19[10],ta="";//sa被除数sb除数sc结果r余数ta新被除数
void getb19();//计算除数的1-9倍
bool isbig(string ,string);//字符串代表的数字比大小
string add(string ,string);//高精度加
string sub(string ,string);//高精度减
void getb19()
{
b19[0]="0",b19[1]=sb;
for(int i=2;i<=9;i++)
b19[i]=add(b19[i-1],sb);
}
bool isbig(string x,string y)
{
if(x.size()==y.size()) return x>y;
return x.size()>y.size();
}
string add(string x,string y)//高精度加
{
int qq[100000],ww[100000],ee[100000];
int lenx,leny,lenz;
string z="";
memset(qq,0,sizeof(qq));
memset(ww,0,sizeof(ww));
memset(ee,0,sizeof(ee));
lenx=x.size();
leny=y.size();
for(int i=0;i<=lenx-1;i++)
qq[i]=x[lenx-1-i]-'0';
for(int i=0;i<=leny-1;i++)
ww[i]=sb[leny-1-i]-'0';
lenz=0;
int tx=0;
while(lenz<=lenx-1||lenz<=leny-1)
{
ee[lenz]=qq[lenz]+ww[lenz]+tx;
tx=ee[lenz]/10;
ee[lenz]%=10;
lenz++;
}
ee[lenz]=tx;
if(ee[lenz]==0)
lenz--;
for(int i=0;i<=lenz;i++)
z=z+char(ee[lenz-i]+'0');
return z;
}
string sub(string x,string y)//高精度减
{
int qq[100000],ww[100000],ee[100000];
int lenx,leny,lenz;
string z="",s;//schange
memset(qq,0,sizeof(qq));
memset(ww,0,sizeof(ww));
memset(ee,0,sizeof(ee));
lenx=x.size();
leny=y.size();
for(int i=0;i<=lenx-1;i++)
qq[i]=x[lenx-1-i]-'0';
for(int i=0;i<=leny-1;i++)
ww[i]=y[leny-1-i]-'0';
lenz=0;
while(lenz<=lenx-1||lenz<=leny-1)
{
if(qq[lenz]<ww[lenz])
{
qq[lenz]+=10;
qq[lenz+1]--;
}
ee[lenz]=qq[lenz]-ww[lenz];
lenz++;
}
while((ee[lenz]==0)&&lenz>0)
lenz--;
for(int i=0;i<=lenz;i++)
z=z+char(ee[lenz-i]+'0');
return z;
}
int main()
{
int lena,lenb;
cin>>sa>>sb;
lena=sa.size();
lenb=sb.size();
getb19();
r=sa.substr(0,lenb-1);
for(int p=lenb-1;p<=lena-1;p++)
{
if(r=="0") ta=sa[p];
else ta=r+sa[p];
int k=9;
while(isbig(b19[k],ta)) k--;//如果比新被除数大就小一倍
c=c+char(k+'0');
r=sub(ta,b19[k]);
}
while(c[0]=='0'&&c.size()>1) c.erase(0,1);
while(r[0]=='0'&&r.size()>1) r.erase(0,1);
cout<<c;
return 0;
}
作者:
demonlover
时间:
2021-8-11 18:30
老师,69排有问题,如果余数不是零的话就加,否则就不加了。如果把零加上去,新的被除数长度就多了一位,用isbig判断的时候就出问题了。
作者:
Crystal1129
时间:
2021-8-11 20:49
#include<bits/stdc++.h>
using namespace std;
string a,b,c,r,b09[10],ta;
bool isbig(string x,string y)
{
bool b1=x.size()>y.size();
bool b2=(x.size()==y.size()) && (x>y);
return b1||b2;
}
string add(string x,string y)
{
if(isbig(y,x)) swap(x,y);
int lx=x.size(),ly=y.size();
for(int p=1;p<=lx-ly;p++) y='0'+y;
int j=0;
string z="";
for(int p=lx-1;p>=0;p--)
{
int x1=x[p]-'0',x2=y[p]-'0';
int x3=x1+x2+j;
if(x3>9) {x3-=10;j=1;}
else j=0;
z=char('0'+x3)+z;
}
if(j==1) z='1'+z;
return z;
}
string sub(string x,string y)
{
int lx=x.size(),ly=y.size();
for(int p=1;p<=lx-ly;p++) y='0'+y;
int j=0;
string z="";
for(int p=lx-1;p>=0;p--)
{
int x3=x[p]-y[p]-j;
if(x3<0)
{
x3+=10;
j=1;
}
else j=0;
z=char('0'+x3)+z;
}
while(z[0]=='0' && z.size()>1) z.erase(0,1);
return z;
}
void getb09()
{
b09[0]='0',b09[1]=b;
for(int i=2;i<=9;i++) b09[i]=add(b09[i-1],b);
}
int main()
{
cin>>a>>b;
int la=a.size();
int lb=b.size();
ta=r=c="";
getb09();
r=a.substr(0,lb-1);
for(int p=0;p<la;p++)
{
ta=r+a[p];
int k=9;
while(isbig(b09[k],ta)) k--;
c=c+char('0'+k);
r=sub(ta,b09[k]);
}
while(c[0]=='0' && c.size()>1) c.erase(0,1);
while(r[0]=='0' && r.size()>1) r.erase(0,1);
cout<<c<<' '<<r;
return 0;
}
复制代码
作者:
神域鬼手
时间:
2021-8-12 08:05
//数组做法(会超时)
#include<bits/stdc++.h>
using namespace std;
string a,b,c="";
string x,r;
string b09[10];
string add(string x,string y)
{
int mm=22000;
int sa[mm],sb[mm],sc[mm];
for(int i=0;i<=mm-1;i++)
{
sa[i]=0;
sb[i]=0;
sc[i]=0;
}
string z="";
int lx=x.size();
int ly=y.size();
for(int i=0;i<=lx-1;i++)
sa[i]=x[lx-i-1]-'0';
for(int i=0;i<=ly-1;i++)
sb[i]=y[ly-i-1]-'0';
for(int i=0;i<=mm-1;i++)
sc[i]=sa[i]+sb[i];
for(int i=0;i<=mm-1;i++)
{
sc[i+1]+=sc[i]/10;
sc[i]=sc[i]%10;
}
int i=mm-1;
while(sc[i]==0&&i>0)
i--;
for(int j=0;j<=i;j++)
z=char(sc[j]+48)+z;
return z;
}
string sub(string x,string y)
{
int mm=22000;
int sa[mm],sb[mm],sc[mm];
for(int i=0;i<=mm-1;i++)
{
sa[i]=0;
sb[i]=0;
sc[i]=0;
}
string z="";
int lx=x.size();
int ly=y.size();
for(int i=0;i<=lx-1;i++)
sa[i]=x[lx-i-1]-'0';
for(int i=0;i<=ly-1;i++)
sb[i]=y[ly-i-1]-'0';
for(int i=0;i<=mm-1;i++)
sc[i]=sa[i]-sb[i];
for(int i=0;i<=mm-1;i++)
{
if(sc[i]<0)
{
sc[i]+=10;
sc[i+1]--;
}
}
int i=mm-1;
while(sc[i]==0&&i>0)
i--;
for(int j=0;j<=i;j++)
z=char(sc[j]+48)+z;
return z;
}
bool isbig(string x,string y)
{
bool b;
b=false;
int lx=x.size();
int ly=y.size();
if((lx>ly)||(lx==ly&&x>y))
b=true;
return b;
}
void getb09()
{
b09[0]='0';
for(int i=1;i<=9;i++)
b09[i]=add(b09[i-1],b);
}
int main()
{
cin>>a>>b;
getb09();
int la=a.size();
for(int p=0;p<=la-1;p++)
{
x=r+a[p];
int k=9;
while(isbig(b09[k],x))
k--;
c=c+char(k+'0');
r=sub(x,b09[k]);
}
int lc=c.size();
int i=0;
while(c[i]=='0'&&i<lc-1)
i++;
for(;i<=lc-1;i++)
cout<<c[i];
return 0;
}
//字符串做法(ac)
#include<bits/stdc++.h>
using namespace std;
string a,b,c="";
string x,r;
string b09[10];
string add(string x,string y)
{
string z="";
int j=0;
int lx=x.size();
int ly=y.size();
int maxl=max(lx,ly);
for(int i=lx;i<=maxl;i++)
x='0'+x;
for(int i=ly;i<=maxl;i++)
y='0'+y;
for(int i=maxl;i>=0;i--)
{
int x1=x[i]-'0';
int x2=y[i]-'0';
int x3=x1+x2+j;
if(x3>9)
{
x3-=10;
j=1;
}
else j=0;
z=char(x3+'0')+z;
}
while(z[0]=='0')
z.erase(0,1);
return z;
}
string sub(string x,string y)
{
string z="";
int j=0;
int lx=x.size();
int ly=y.size();
int maxl=max(lx,ly);
for(int i=lx;i<=maxl;i++)
x='0'+x;
for(int i=ly;i<=maxl;i++)
y='0'+y;
for(int i=maxl;i>=0;i--)
{
int x1=x[i]-'0';
int x2=y[i]-'0';
int x3=x1-x2-j;
if(x3<0)
{
x3+=10;
j=1;
}
else j=0;
z=char(x3+'0')+z;
}
while(z[0]=='0')
z.erase(0,1);
return z;
}
bool isbig(string x,string y)
{
bool b;
b=false;
int lx=x.size();
int ly=y.size();
if((lx>ly)||(lx==ly&&x>y))
b=true;
return b;
}
void getb09()
{
b09[0]='0';
for(int i=1;i<=9;i++)
b09[i]=add(b09[i-1],b);
}
int main()
{
cin>>a>>b;
getb09();
int la=a.size();
r=a.substr(0,b.size()-1);
for(int p=b.size()-1;p<=la-1;p++)
{
x=r+a[p];
int k=9;
while(isbig(b09[k],x))
k--;
c=c+char(k+'0');
r=sub(x,b09[k]);
}
int lc=c.size();
int i=0;
while(c[i]=='0'&&i<lc-1)
i++;
for(;i<=lc-1;i++)
cout<<c[i];
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2