首页 > 编程知识 正文

整数除法方法总结,整数除以整数的方法

时间:2023-05-06 08:09:01 阅读:160600 作者:2005

问题说明求除以两个大正整数的商

输入数据

第一行是测试数据的组数n,各组的测试数据占两行,第一行是被除数,第二行是除数。 每组测试数据之间有一个空行,每行数据不超过100个字符

输出请求

n行、各测试数据1行的输出是对应的整数商

输入样品

3

2405337312963373359009260457742057439230496493930355595797660791082739646

2987192585318701752584429931160870372907079248971095012509790550883793197894

10000000000000000000000000000000000000000

10000000000

5409656775097850895687056798068970934546546575676768678435435345

1

输出样本

0

1000000000000000000000000000000

解决5096567750978508956870567980689709345465465675676768678435435345问题的基本思路是:反复减法,被除数最多能减去多少除数,商是多少一个一个地减少显然太晚了。 如何更快地减少呢? 让我们看看7546除以23的例子。 启动是0。 首先减去23的100倍就是2300,可以减少3次,发现是剩下的646。 于是商品的价格增加300。 然后在646减去230,发现充分地减去了2次,在剩下的186中,商品的值增加了20。 最后186减去23,可以减少8次。 因此,最终商品是328。

因此,正题的核心是写出大整数的减法函数,反复调用该函数进行减法操作。

计算除数的10倍、100倍时,即使不进行乘法运算,直接在除数后面补0即可。

参考步骤# include stdio.h # include string.h # definemax _ len 200 char szline1[ max _ len 10 ]; char szLine2[MAX_LEN 10]; int an1[MAX_LEN 10]; //被除数,an1[0]为位int an2[MAX_LEN 10]; //除数,an2[0]是位int aResult[MAX_LEN 10]; //存储区,其中aResult[0]对应于1位/* Substract函数。 将长度为nLen1的大整数p1减去长度为nLen2的大整数p2后的结果放入p1。 返回值表示如果结果的长度小于-1,则正好0p1[0],p2[0]返回一位。if(nlen1nlen2) return -1; //接下来判断p1是否大于p2,否则返回-1bool bLarger=false; if(nlen1==nlen2) { for } I=nlen1- 1; i=0; I--}{if(P1[I]P2[I] ) bLarger=true; elseif(P1[I]P2[I] ) if (! b larger (返回- 1; }}for(I=0; i nLen1; I ) )//减法p1[i] -=p2[i]; //调用本函数时给出的参数,在i=nLen2的情况下,p2[I]=0if(p1[I]0) ) {p1[i]=10; p1[i 1] --; }for(I=nlen1-1; i=0; I----if(P1[I] )返回I 1; 返回0; (}int main ) ) {int t,n; char szBlank[20]; scanf('%d ',n ); for(t=0; t n; t ) Scanf('%s ',szLine1); scanf('%s ',szLine2); int i,j; intnlen1=Strlen(szline1); memset (an1,0,sizeof ) an1 ); memset (an2,0,sizeof ) an2 ); memset(aresult,0,sizeof ) (aresult ); j=0; for(I=nlen1-1; i=0; I----an1[j]=szline1[I]-'0'; intnlen2=Strlen(Szline2); j=0; for(I=nlen2-1; i=0; I----an2[j]=szline2[I]-'0'; if(nlen1nlen2) printf(0(n ); 连续; }nLen1=substract(an1,an2,nlen1,nLen2); if(nlen10 )打印(0(n ); 连续; }elseif(nlen1==0) ) printf(1(n ); 连续; }aResult[0];//减去1次,商加上1//后的结果长度为nLen1int nTimes=nLen1 - nLen2; (if ) ntimes0)//减去一次就不能再减少goto OutputResult; 将elseif(ntimes0)//an2乘以10的幂,得到长度与an1相同的for(I=nlen1-1; i=0; I--}{if(I=ntimes ) an2[i]=an2[i-nTimes]; elsean2[i]=0; }}nLen2=nLen1; for(j=0; j=nTimes; j({intntmp; ///减少到不够//先减少几个an2 j(10的nTimes次方),//如果不够了,再减少几个an2),……while ) ) (ntmp=substract )//每次减法成功后,在商的相应位上显示1}}OutputResult://以下循环中进位问题for(I=0; i MAX_LEN; I () if ) aresult[I]=10 ) {aResult[i 1] =aResult[i]/10; aResult[i] %=10; //下一个输出结果bool bStartOutput=false; for(I=max_len; i=0; I--; if(bstartoutput ) printf )、aResult[i]; elseif(aResult[i] ) printf ),aresult[I]; bStartOutput=true; (if (! btartoutput(printf(0(n ); 打印((n ); }return 0; }

常见问题1、忘记对每组测试数据首先将an1、an2和aResult初始化为全0,一共只初始化一次。 结果,从第二个测试数据开始是错误的。

问题二、借用减法处理时,容易忽略连续借用。 例如,如果是1000087,借用将前进到1。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。