📜  表示为String的大数平方

📅  最后修改于: 2021-05-31 17:05:39             🧑  作者: Mango

给定一个非常大的数字,任务是编写一个程序来计算其平方。

例子:

幼稚的方法:幼稚的方法是通过将数字乘以自身来计算平方。但是在C++中,如果输入的数字很大,则结果平方将溢出。

高效的方法:一种有效的方法是将数字存储为字符串,然后对两个大数字进行乘法运算。

下面是上述方法的实现:

C++
// C++ program to multiply two numbers
// represented as strings.
#include 
using namespace std;
 
// Multiplies str1 and str2, and prints result.
string multiply(string num1, string num2)
{
    int n1 = num1.size();
    int n2 = num2.size();
    if (n1 == 0 || n2 == 0)
        return "0";
 
    // will keep the result number in vector
    // in reverse order
    vector result(n1 + n2, 0);
 
    // Below two indexes are used to find positions
    // in result.
    int i_n1 = 0;
    int i_n2 = 0;
 
    // Go from right to left in num1
    for (int i = n1 - 1; i >= 0; i--) {
        int carry = 0;
        int n1 = num1[i] - '0';
 
        // To shift position to left after every
        // multiplication of a digit in num2
        i_n2 = 0;
 
        // Go from right to left in num2
        for (int j = n2 - 1; j >= 0; j--) {
            // Take current digit of second number
            int n2 = num2[j] - '0';
 
            // Multiply with current digit of first number
            // and add result to previously stored result
            // at current position.
            int sum = n1 * n2 + result[i_n1 + i_n2] + carry;
 
            // Carry for next iteration
            carry = sum / 10;
 
            // Store result
            result[i_n1 + i_n2] = sum % 10;
 
            i_n2++;
        }
 
        // store carry in next cell
        if (carry > 0)
            result[i_n1 + i_n2] += carry;
 
        // To shift position to left after every
        // multiplication of a digit in num1.
        i_n1++;
    }
 
    // ignore '0's from the right
    int i = result.size() - 1;
    while (i >= 0 && result[i] == 0)
        i--;
 
    // If all were '0's - means either both or
    // one of num1 or num2 were '0'
    if (i == -1)
        return "0";
 
    // generate the result string
    string s = "";
       
    while (i >= 0)
        s += std::to_string(result[i--]);
 
    return s;
}
 
// Driver code
int main()
{
    string str1 = "454545454545454545";
 
    cout << multiply(str1, str1);
 
    return 0;
}


Java
// Java program to multiply two numbers
// represented as strings.
 
class GFG
{
 
    // Multiplies str1 and str2, and prints result.
    public static String multiply(String num1, String num2)
    {
        int n1 = num1.length();
        int n2 = num2.length();
        if (n1 == 0 || n2 == 0)
            return "0";
 
        // will keep the result number in vector
        // in reverse order
        int[] result = new int[n1 + n2];
 
        // Below two indexes are used to find positions
        // in result.
        int i_n1 = 0;
        int i_n2 = 0;
 
        // Go from right to left in num1
        for (int i = n1 - 1; i >= 0; i--)
        {
            int carry = 0;
            int n_1 = num1.charAt(i) - '0';
 
            // To shift position to left after every
            // multiplication of a digit in num2
            i_n2 = 0;
 
            // Go from right to left in num2
            for (int j = n2 - 1; j >= 0; j--)
            {
 
                // Take current digit of second number
                int n_2 = num2.charAt(j) - '0';
 
                // Multiply with current digit of first number
                // and add result to previously stored result
                // at current position.
                int sum = n_1 * n_2 + result[i_n1 + i_n2] + carry;
 
                // Carry for next iteration
                carry = sum / 10;
 
                // Store result
                result[i_n1 + i_n2] = sum % 10;
 
                i_n2++;
            }
 
            // store carry in next cell
            if (carry > 0)
                result[i_n1 + i_n2] += carry;
 
            // To shift position to left after every
            // multiplication of a digit in num1.
            i_n1++;
        }
 
        // ignore '0's from the right
        int i = result.length - 1;
        while (i >= 0 && result[i] == 0)
            i--;
 
        // If all were '0's - means either both or
        // one of num1 or num2 were '0'
        if (i == -1)
            return "0";
 
        // generate the result string
        String s = "";
        while (i >= 0)
            s += Integer.toString(result[i--]);
 
        return s;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str1 = "454545454545454545";
        System.out.println(multiply(str1, str1));
 
    }
}
 
// This code is contributed by
// sanjeev2552


Python3
# Python3 program to multiply two numbers
# represented as strings.
 
# Multiplies str1 and str2, and prints result.
def multiply(num1, num2):
     
    n1 = len(num1)
    n2 = len(num2)
     
    if (n1 == 0 or n2 == 0):
        return "0"
 
    # Will keep the result number in vector
    # in reverse order
    result = [0] * (n1 + n2)
 
    # Below two indexes are used to
    # find positions in result.
    i_n1 = 0
    i_n2 = 0
 
    # Go from right to left in num1
    for i in range(n1 - 1, -1, -1):
        carry = 0
        n_1 = ord(num1[i]) - ord('0')
 
        # To shift position to left after every
        # multiplication of a digit in num2
        i_n2 = 0
 
        # Go from right to left in num2
        for j in range(n2 - 1, -1, -1):
             
            # Take current digit of second number
            n_2 = ord(num2[j]) - ord('0')
 
            # Multiply with current digit of first number
            # and add result to previously stored result
            # at current position.
            sum = n_1 * n_2 + result[i_n1 + i_n2] + carry
 
            # Carry for next iteration
            carry = sum // 10
 
            # Store result
            result[i_n1 + i_n2] = sum % 10
 
            i_n2 += 1
 
        # Store carry in next cell
        if (carry > 0):
            result[i_n1 + i_n2] += carry
 
        # To shift position to left after every
        # multiplication of a digit in num1.
        i_n1 += 1
 
    # Ignore '0's from the right
    i = len(result) - 1
     
    while (i >= 0 and result[i] == 0):
        i -= 1
 
    # If all were '0's - means either both or
    # one of num1 or num2 were '0'
    if (i == -1):
        return "0"
 
    # Generate the result string
    s = ""
     
    while (i >= 0):
        s += str(result[i])
        i -= 1
 
    return s
 
# Driver code
if __name__ == "__main__":
     
    str1 = "454545454545454545"
 
    print(multiply(str1, str1))
 
# This code is contributed by chitranayal


C#
// C# program to multiply two numbers
// represented as strings.
using System;
using System.Collections.Generic;
     
class GFG
{
 
    // Multiplies str1 and str2,
    // and prints result.
    public static String multiply(String num1,
                                  String num2)
    {
        int n1 = num1.Length;
        int n2 = num2.Length;
        if (n1 == 0 || n2 == 0)
            return "0";
 
        // will keep the result number in vector
        // in reverse order
        int[] result = new int[n1 + n2];
 
        // Below two indexes are used to
        // find positions in result.
        int i_n1 = 0;
        int i_n2 = 0;
        int i = 0;
         
        // Go from right to left in num1
        for (i = n1 - 1; i >= 0; i--)
        {
            int carry = 0;
            int n_1 = num1[i] - '0';
 
            // To shift position to left after every
            // multiplication of a digit in num2
            i_n2 = 0;
 
            // Go from right to left in num2
            for (int j = n2 - 1; j >= 0; j--)
            {
 
                // Take current digit of second number
                int n_2 = num2[j] - '0';
 
                // Multiply with current digit of first number
                // and add result to previously stored result
                // at current position.
                int sum = n_1 * n_2 +
                          result[i_n1 + i_n2] + carry;
 
                // Carry for next iteration
                carry = sum / 10;
 
                // Store result
                result[i_n1 + i_n2] = sum % 10;
 
                i_n2++;
            }
 
            // store carry in next cell
            if (carry > 0)
                result[i_n1 + i_n2] += carry;
 
            // To shift position to left after every
            // multiplication of a digit in num1.
            i_n1++;
        }
 
        // ignore '0's from the right
        i = result.Length - 1;
        while (i >= 0 && result[i] == 0)
            i--;
 
        // If all were '0's - means either both or
        // one of num1 or num2 were '0'
        if (i == -1)
            return "0";
 
        // generate the result string
        String s = "";
        while (i >= 0)
            s += (result[i--]).ToString();
 
        return s;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        String str1 = "454545454545454545";
        Console.WriteLine(multiply(str1, str1));
    }
}
 
// This code is contributed by Princi Singh


输出:
206611570247933883884297520661157025
想要从精选的最佳视频中学习并解决问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”