给定一个整数X ,它是一个完美的平方,任务是使用长除法找到它的平方根。
例子:
Input: N = 484
Output: 22
222 = 484
Input: N = 144
Output: 12
122 = 144
方法:
长除法是查找数字平方根的一种非常常用的方法。以下是此方法的分步解决方案:
- 从单位位置的数字开始,将数字的位数分成几对段。让我们将每对和其余的最终数字(如果数字中的数字计数为奇数)标识为一个段。
例如:1225 is divided as (12 25)
- 将数字分成几段后,从最左边的段开始。平方等于或小于第一段的最大数字被除数,并被除以商(以使乘积为平方)。
例如:9 is the closest perfect square to 12, the first segment 12
- 从第一个细分中减去除数的平方,然后将下一个细分向下至其余部分的右侧,以获取新的股息。
例如:12 - 9 = 3 is concatenated with next segment 25. New dividend = 325
- 现在,通过将先前的商(在上面的示例中为3,即3 2 = 9)取两倍,并用合适的数字(也被当作商的下一个数字)进行级联来获得新的除数。新除数与该数字的乘积等于或小于新除数的一种方式。
例如:Two times quotient 3 is 6.
65 times 5 is 325 which is closest to the new dividend.
- 重复步骤(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