"Algorithmic Learning Notes" 34. High-Precision Division SJTU OJ 1026/1016

Source: Internet
Author: User

High-precision division, as with the addition and subtraction, we have to start with the hand calculation. Give an example, for example, 524134 divided by 123. The result is 4261.

The first 4 of the source is we put 524 and 123 aligned, and then the cycle of subtraction, 4 cycles, the remaining 32, 32134 of the first three bits 321 continue and 123 alignment, the cycle subtraction 2 times, and 75, 7534 of the first three bits 753 and 123 align, Cycle subtraction 6 times, remaining 15, 154 and 123 are aligned, can only be reduced 1 times, so the result is 4 2 6 1.

Programmed the above process

1. Deposit A, b two number in the Char array 0 subscript indicates the highest bit
2. Compare the pre-LenB and B-alignment of a to size
3. If the previous lenb of a in the 2 comparison result is large, then the cyclic subtraction is performed until it is smaller than B and the number of cycles is denoted as s[0] to indicate the highest position of the final result.
4. If the previous LenB bit of a in the 2 comparison result is small, do nothing.
5. The whole B is backward to one, and the highest position of a (the highest bit may be 0 for the time being), the subscript iteration +1 of S is the calculation of the next digit.
6. Continuously compared until the tail of B is aligned with the tail of a, the last LenB bit of A is also a cyclic subtraction arithmetic, so the result is obtained. Terminating the program
The above mentioned LenB are the length of the first B, and later due to the displacement will lead to increased

The process is as follows

a:524134/

b:123/

4-time subtraction of loops

a:032134/

b:0123/-----Loop dislocation Front complement 0

2-time subtraction of loops

a:007534/

b:00123/

6-time subtraction of loops

a:000154/

b:000123/

1-time subtraction of loops

The source code is as follows:

#include <iostream>#include<cstring>#include<cstdio>#defineMAX 10001using namespacestd;Chara[max]={'0'},b[max]={'0'};intLena=0, lenb=0;intres[max]={0};BOOLIsgreater () {returnSTRNCMP (A,B,LENB) >=0;//Note that the LENB will increase because of the shift, so don't worry.}//subtract the current highest bit of a and the highest bit of BvoidSub () {//first of all to find the highest bit of a and B alignment, because in the while loop has been the size of the judgment, when the highest position refers to the true highest bit    intI, begin =0;  for(i =0; a[i]=='0'; ++i) Begin=i; //at this point, begin and I are the highest-level subscripts that are already aligned with B.     for(; i < LenB; + +)i) a[i]= A[i]-B[i] +'0';//Note that if you use-=, it should be a[i]-= b[i]-' 0 '//start borrow to borrow negative complement from right to left     for(inti = lenb-1; i >0; I.)if(a[i]<'0') {A[i]+=Ten; A[i-1]--; }} intMainintargcChar Const*argv[]) {cin>>A>>B; LenA=strlen (A); LenB=strlen (B); //If A is less than B direct output 0 ends.    if(Lena<lenb or (LENA==LENB and!)Isgreater ())) {cout<<0<<endl;return 0; }    intRes_i =0;//Tag res array being processed subscript 0 is the highest bit     while(1){//Break when last aligned//begin cyclic subtraction of the first lenb bits of A and B                 while(Isgreater ()) {sub (); ++Res[res_i]; }        ++res_i; //if the last remainder is less than the number of digits of B, then cot is 0 no problem        if(LENA==LENB)//must be checked immediately after the subtraction cycle, because the LENB changed after the shift, and it's not necessary.             Break; //Move right to B note LenB to increase by 1        intJ;  for(j = lenb++; J >0; --j) B[j]=b[j-1]; B[J]='0'; }    BOOLFlag =true;//indicates that there will be 0 output     for(inti =0; i < res_i; ++i) {if(Flag and res[i]!=0) Flag=false;//already encountered the first number that is not 0 indicates that there are 0 outputs        if(res[i]==0){            if(!flag) cout<<0; }Elsecout<<Res[i]; } cout<<Endl; return 0;}
View Code

"Algorithmic Learning Notes" 34. High-Precision Division SJTU OJ 1026/1016

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.