首页 > 编程知识 正文

整数除法竖式计算过程,大数除法计算过程步骤

时间:2023-05-03 23:29:40 阅读:160596 作者:4278

这个大的整数除法是指求出a除以b得到的整数比特的结果。 当然也要求剩余,但不是要求准确的小数结果。

举个例子,构想:

求出a=17693b=23a/b

len(a )=5,len(a ) )=2

那么

1. 17693 - 23000 0,跳过

2. 17693 - 2300*7=1593

3. 1593 - 230*6=213

4. 213 - 23*9=6

5. 6 - 23 0,跳过

现在很清楚了。 17693/23=769余6

从上面的例子可以很清楚的知道, 其实做除法是一个做减法的过程. 那为什么不直接一次一次减23呢? 因为这样会耗费很多时间, 所以从23的10^len倍减起, 这样时间上会快很多. 当然代码写起来也麻烦不少.

整个代码也不过60行

# include iostream # includevectorusingnamespacestd; vectorint num1,num2; voidstrtovector(stringS1,string s2 ) { int len1=s1.size ),len2=s2.size; if(len1len2)返回; for(intI=len1-1; i=0; -I ) ) num1.push_back(S1[I]-'0' ); }for(intI=len2-1; i=0; -I () num2.push_back ) S2[I]-'0' ); (while(num1.size )!=num2.size () ) num2.insert ) num2.Begin ),0 ); }boolisbigger(vectorintV1,vectorint v2 ) /返回v1是否大于v2 ({ int L1=v1.size ),l2=v2.size ); 国际空间站!=l2 ) return l1 l2; for(intI=L1-1; i=0; -I () if ) V1[I]==V2[I] ) continue; if(V1 ) I ) V2 ) I ) )返回0; else return 1; } return 1; }voidsub(vectorintV1,vectorint v2 ) /后缀0, pop_back ) (while ) v1.size ) ) v2.push_back(0 i v1.size () 0; I ) (if ) V1 ) I ) V2 ) I ) ) V1 ) I )=10-V2 ) I ); v1[i 1] -=1; } else v1[i] -=v2[i]; }while(V1.back(==0) ) { v1.pop_back ); }}int main () { string sn1,sn2; cin sn1 sn2; int len1=sn1.size (,len2=sn2.size ); strtovector(sn1、sn2 ); int len=len1 - len2,ans=0; for(intI=0; i=len; I ) { int time=0; while(isbigger(num1,num2) ) sub ) num1,num2); //进行减法运算,num1为减法运算出的数time; }if(isbigger(num1,num2)==is bigger (num 2,num1) ) time=1; ans=ans * 10 time; num2.erase(num2.Begin ) ); //零前缀0 )0) 0 } cout ans; (/) 1769323 ) /虽然是精确到小数点以下的高精度除法,但是如果能被整除的话好像不太能应对。想法和上面的整数除法相同。

# include iostream # includevectorusingnamespacestd; boolisbigger(vectorinta,vectorint b ) if ) a.size )!=b.size () (return a.size ) (b.size ); int len=a.size ()- 1; while(len=0) {if ) a[len]!=b[len](returna[len]b[len]; len--; } return true; //如果等于,则返回true } voidsub (vector intv 1,vectorint v2 )//后缀0, pop_back ) ({while ) v1.size ) ) } i v1.size () 0; I ) (if ) V1 ) I ) V2 ) I ) ) V1 ) I )=10-V2 ) I ); v1[i 1] -=1; } else v1[i] -=v2[i]; }while(V1.back(==0) ) { v1.pop_back ); }}int main () { vectorint a,b; char c; string ans=' '; int index=0,n; wile(1) { c=getchar; if(c==''|c=='n ' ) break; a.insert(a.Begin ),c - '0); }while(1) { c=getchar; if(c==''|c=='n ' ) break; b.insert(b.Begin ),c - '0); }while(isbigger(a,b ) ) b.insert ) b.begin ),0 ); 索引; (} cin n; for(intI=0; i=n; I ) { int time=0; a.insert(a.Begin ),0 ); wile(isbigger(a,b ) ) sub ) a,b ); 时间; } ans ='0' time; }for(intI=0; Ians.size(-2; I ) if(I==index ) if ) index==0) cout '0); cout '.'; } cout ans[i]; } if (ans (ans (ans.size (-1 ) '4) (cout ) char ) ) ans ) ans.size(-2 )1); elsecoutans[ans.size((-1] ); cout endl; //213239.2608695652173913043478260869565 /

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