📜  用实例查找平方根的长除法

📅  最后修改于: 2021-04-24 15:14:45             🧑  作者: Mango

给定一个整数X ,它是一个完美的平方,任务是使用长除法找到它的平方根。

例子:

方法:
长除法是查找数字平方根的一种非常常用的方法。以下是此方法的分步解决方案:

  1. 从单位位置的数字开始,将数字的位数分成几对段。让我们将每对和其余的最终数字(如果数字中的数字计数为奇数)标识为一个段。
    例如:
    1225 is divided as (12 25)

  2. 将数字分成几段后,从最左边的段开始。平方等于或小于第一段的最大数字被除数,并被除以商(以使乘积为平方)。
    例如:
    9 is the closest perfect square to 12, the first segment 12

  3. 从第一个细分中减去除数的平方,然后将下一个细分向下至其余部分的右侧,以获取新的股息。
    例如:
    12 - 9 = 3 is concatenated with next segment 25.
    New dividend = 325 

  4. 现在,通过将先前的商(在上面的示例中为3,即3 2 = 9)取两倍,并用合适的数字(也被当作商的下一个数字)进行级联来获得新的除数。新除数与该数字的乘积等于或小于新除数的一种方式。
    例如:
    Two times quotient 3 is 6.

    65 times 5 is 325 which is closest to the new dividend. 

  5. 重复步骤(2),(3)和(4),直到所有节段都已装满。现在,这样获得的商就是给定数的所需平方根。

下面是上述方法的实现:

CPP
// C++ program to find the square root of a
// number by using long division method
  
#include 
using namespace std;
#define INFINITY_ 9999999
  
// Function to find the square root of
// a number by using long division method
int sqrtByLongDivision(int n)
{
    int i = 0, udigit, j; // Loop counters
    int cur_divisor = 0;
    int quotient_units_digit = 0;
    int cur_quotient = 0;
    int cur_dividend = 0;
    int cur_remainder = 0;
    int a[10] = { 0 };
  
    // Dividing the number into segments
    while (n > 0) {
        a[i] = n % 100;
        n = n / 100;
        i++;
    }
  
    // Last index of the array of segments
    i--;
  
    // Start long division from the last segment(j=i)
    for (j = i; j >= 0; j--) {
  
        // Initialising the remainder to the maximum value
        cur_remainder = INFINITY_;
        // Including the next segment in new dividend
        cur_dividend = cur_dividend * 100 + a[j];
  
        // Loop to check for the perfect square
        // closest to each segment
        for (udigit = 0; udigit <= 9; udigit++) {
  
            // This condition is to find the
            // divisor after adding a digit
            // in the range 0 to 9
            if (cur_remainder >= cur_dividend
                                     - ((cur_divisor * 10 + udigit)
                                        * udigit)
                && cur_dividend
                           - ((cur_divisor * 10 + udigit) * udigit)
                       >= 0) {
  
                // Calculating the remainder
                cur_remainder = cur_dividend - ((cur_divisor * 10
                                                 + udigit)
                                                * udigit);
  
                // Updating the units digit of the quotient
                quotient_units_digit = udigit;
            }
        }
  
        // Adding units digit to the quotient
        cur_quotient = cur_quotient * 10
                       + quotient_units_digit;
  
        // New divisor is two times quotient
        cur_divisor = cur_quotient * 2;
  
        // Including the remainder in new dividend
        cur_dividend = cur_remainder;
    }
  
    return cur_quotient;
}
  
// Driver code
int main()
{
    int x = 1225;
    cout << sqrtByLongDivision(x) << endl;
    return 0;
}


Java
// Java program to find the square root of a
// number by using long division method
import java.util.*;
  
class GFG{
static final int INFINITY_ =9999999;
   
// Function to find the square root of
// a number by using long division method
static int sqrtByLongDivision(int n)
{
    int i = 0, udigit, j; // Loop counters
    int cur_divisor = 0;
    int quotient_units_digit = 0;
    int cur_quotient = 0;
    int cur_dividend = 0;
    int cur_remainder = 0;
    int a[] = new int[10];
   
    // Dividing the number into segments
    while (n > 0) {
        a[i] = n % 100;
        n = n / 100;
        i++;
    }
   
    // Last index of the array of segments
    i--;
   
    // Start long division from the last segment(j=i)
    for (j = i; j >= 0; j--) {
   
        // Initialising the remainder to the maximum value
        cur_remainder = INFINITY_;
        // Including the next segment in new dividend
        cur_dividend = cur_dividend * 100 + a[j];
   
        // Loop to check for the perfect square
        // closest to each segment
        for (udigit = 0; udigit <= 9; udigit++) {
   
            // This condition is to find the
            // divisor after adding a digit
            // in the range 0 to 9
            if (cur_remainder >= cur_dividend
                                     - ((cur_divisor * 10 + udigit)
                                        * udigit)
                && cur_dividend
                           - ((cur_divisor * 10 + udigit) * udigit)
                       >= 0) {
   
                // Calculating the remainder
                cur_remainder = cur_dividend - ((cur_divisor * 10
                                                 + udigit)
                                                * udigit);
   
                // Updating the units digit of the quotient
                quotient_units_digit = udigit;
            }
        }
   
        // Adding units digit to the quotient
        cur_quotient = cur_quotient * 10
                       + quotient_units_digit;
   
        // New divisor is two times quotient
        cur_divisor = cur_quotient * 2;
   
        // Including the remainder in new dividend
        cur_dividend = cur_remainder;
    }
   
    return cur_quotient;
}
   
// Driver code
public static void main(String[] args)
{
    int x = 1225;
    System.out.print(sqrtByLongDivision(x) +"\n");
}
}
  
// This code is contributed by Rajput-Ji


Python3
# Python3 program to find the square root of a
# number by using long division method
INFINITY_ = 9999999
  
# Function to find the square root of
# a number by using long division method
def sqrtByLongDivision(n):
    i = 0
    udigit, j = 0, 0 # Loop counters
    cur_divisor = 0
    quotient_units_digit = 0
    cur_quotient = 0
    cur_dividend = 0
    cur_remainder = 0
    a = [0]*10
  
    # Dividing the number into segments
    while (n > 0):
        a[i] = n % 100
        n = n // 100
        i += 1
  
    # Last index of the array of segments
    i -= 1
  
    # Start long division from the last segment(j=i)
    for j in range(i, -1, -1):
  
        # Initialising the remainder to the maximum value
        cur_remainder = INFINITY_
          
        # Including the next segment in new dividend
        cur_dividend = cur_dividend * 100 + a[j]
  
        # Loop to check for the perfect square
        # closest to each segment
        for udigit in range(10):
  
            # This condition is to find the
            # divisor after adding a digit
            # in the range 0 to 9
            if (cur_remainder >= cur_dividend
                                - ((cur_divisor * 10 + udigit)
                                * udigit)
                                and cur_dividend
                                - ((cur_divisor * 10 + udigit) * udigit)
                                >= 0):
  
                # Calculating the remainder
                cur_remainder = cur_dividend - ((cur_divisor * 10
                                                + udigit)
                                                * udigit)
  
                # Updating the units digit of the quotient
                quotient_units_digit = udigit
  
  
        # Adding units digit to the quotient
        cur_quotient = cur_quotient * 10 + quotient_units_digit
  
        # New divisor is two times quotient
        cur_divisor = cur_quotient * 2
  
        # Including the remainder in new dividend
        cur_dividend = cur_remainder
  
    return cur_quotient
  
# Driver code
  
x = 1225
print(sqrtByLongDivision(x))
  
# This code is contributed by mohit kumar 29


C#
// C# program to find the square root of a
// number by using long division method
using System;
  
class GFG
{
static readonly int INFINITY_ =9999999;
  
// Function to find the square root of
// a number by using long division method
static int sqrtBylongDivision(int n)
{
    int i = 0, udigit, j; // Loop counters
    int cur_divisor = 0;
    int quotient_units_digit = 0;
    int cur_quotient = 0;
    int cur_dividend = 0;
    int cur_remainder = 0;
    int []a = new int[10];
  
    // Dividing the number into segments
    while (n > 0) {
        a[i] = n % 100;
        n = n / 100;
        i++;
    }
  
    // Last index of the array of segments
    i--;
  
    // Start long division from the last segment(j=i)
    for (j = i; j >= 0; j--) {
  
        // Initialising the remainder to the maximum value
        cur_remainder = INFINITY_;
          
        // Including the next segment in new dividend
        cur_dividend = cur_dividend * 100 + a[j];
  
        // Loop to check for the perfect square
        // closest to each segment
        for (udigit = 0; udigit <= 9; udigit++) {
  
            // This condition is to find the
            // divisor after adding a digit
            // in the range 0 to 9
            if (cur_remainder >= cur_dividend
                                    - ((cur_divisor * 10 + udigit)
                                        * udigit)
                && cur_dividend
                        - ((cur_divisor * 10 + udigit) * udigit)
                    >= 0) {
  
                // Calculating the remainder
                cur_remainder = cur_dividend - ((cur_divisor * 10
                                                + udigit)
                                                * udigit);
  
                // Updating the units digit of the quotient
                quotient_units_digit = udigit;
            }
        }
  
        // Adding units digit to the quotient
        cur_quotient = cur_quotient * 10
                    + quotient_units_digit;
  
        // New divisor is two times quotient
        cur_divisor = cur_quotient * 2;
  
        // Including the remainder in new dividend
        cur_dividend = cur_remainder;
    }
  
    return cur_quotient;
}
  
// Driver code
public static void Main(String[] args)
{
    int x = 1225;
    Console.Write(sqrtBylongDivision(x) +"\n");
}
}
  
  
  
// This code is contributed by Rajput-Ji


输出:
35