ITPub博客

首页 > > > 大整数除法,只有九分,求大神帮看BUG

大整数除法,只有九分,求大神帮看BUG

作者:llittle 时间:2019-09-03 10:41:33 0 删除 编辑

http://noi.openjudge.cn/ch0113/47/

求两个大的正整数相除的商。

输入第1行是被除数,第2行是除数。每个数均不超过100位。输出一行,相应的商的整数部分

 

 

 

/*高精度除以低精,是对被除数的每一位(每一位包括前面的余数,以下都是如此)都除以除数。而高精度

除以高精度则是用减法模拟法,对于被除数的每一位都减去除数,一直减到当前位置的数字(包括前面的余数)

小于除数(由于每一位数字都小于10,所以对于每一位最多进行十次计算)*/

#include

#include

using namespace std;

int a[2201],b[2201],c[2201],d,i;

void init (int a[])//数据类型为void, 表示只有功能没有返回值;数据类型 函数名 (形式参数表)

{

string s;//定义一个字符串类型的变量s

cin>>s;//读入字符串S

a[0]=s.length();//用a[0]计算字符串S的位数,括号没什么用,就是一种格式

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

a[i]=s[a[0]-i]-'0';//将数串S转换为数组A,并且倒序存储

}

void print(int a[])//类型为整数型,打印输出 

{

int i;

if(a[0]==0){cout<<0<

for(i=a[0];i>0;i--) cout<

return;

}

int compare(int a[],int b[])//比较a和b的大小关系,若a>b则为1,a

{

int i;

if(a[0]>b[0]) return 1;//a的位数大于b,则a>b 

if(a[0]

for(i=a[0];i>0;i--)//从高位到低位比较

{if(a[i]>b[i]) return 1;

if(a[i]

} 

return 0;//各个数位都相等则两数相等 

}

void jian(int a[],int b[])//计算A=A-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]

a[i]-=b[i]; 

}

while (a[0]>0&&a[a[0]]==0) a[0]--;//a[0]存储长度,a[a[0]]代表最高一位,如果等于0,删除前导零,修正A的位数

return; 

} 

}

void numcpy(int p[],int q[],int det)//复制P数组到Q数组从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[201];

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);//商 

//print(a);//余数 

return 0;

}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/813/viewspace-3126942/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-12

  • 博文量
    448
  • 访问量
    4362