用c++写一个高精度计算的加法算法,输入两个正整数,求它们的和

以下是一个简单的C++程序,用于执行高精度加法操作。该程序将两个正整数作为输入,然后计算它们的和,并以字符串形式输出结果。这个程序可以处理非常大的整数。

#include
using namespace std;
int a1[200],b1[200],c[200];
int main(){
    char a[200]="10012",b[200]="4";
    int lena=strlen(a);
    int lenb=strlen(b);
    for(int i=1;i<=lena;i++){
        a1[i]=a[lena-i]-'0';
    }
    for(int i=1;i<=lenb;i++){
        b1[i]=b[lenb-i]-'0';
    }
    int lenc=1;
    int x=0;
    while(lenc<=lena||lenc<=lenb){
        c[lenc]=a1[lenc]+b1[lenc]+x;
        x = c[lenc]/10;
        c[lenc]%=10;
        lenc++;
    }
    c[lenc]=x;
    while(c[lenc]==0&&lenc>1){
        lenc--;
    }
    for(int i=lenc;i>=1;i--){
        cout<<c[i];
    }
    cout<<endl;
    return 0;
}

代码解释

这段C++代码实现了两个大整数的高精度加法,其中大整数以字符数组的形式表示,并将它们按位相加,处理进位。以下是代码的逐行解释:

  1. #include:这是一个预处理指令,通常在C++中用于包含一些常用的标准库头文件,以简化编程。在这里,它包含了一些常用的C++标准库头文件。

  2. using namespace std;:这一行指示代码将使用C++标准命名空间,这意味着你可以直接使用标准库中的函数和对象,而不需要使用前缀std::

  3. int a1[200], b1[200], c[200];:定义了三个整数数组,a1b1c,用于存储大整数的各个位数。

  4. char a[200] = "10012", b[200] = "4";:定义了两个字符数组ab,用于表示两个大整数。这里初始化了a为"10012"和b为"4"。

  5. int lena = strlen(a);int lenb = strlen(b);:计算了两个大整数的长度,即它们的位数。

  6. for (int i = 1; i <= lena; i++)for (int i = 1; i <= lenb; i++):这两个循环用于将字符数组中的数字字符转换为整数并存储在a1b1数组中。它们也在每一步中打印了a1b1的内容。

  7. int lenc = 1;:初始化变量lenc,用于表示结果数组c的长度。

  8. int x = 0;:初始化变量x,用于存储进位的值,初始值为0。

  9. while (lenc <= lena || lenc <= lenb):这是一个循环,它会一位一位地处理两个大整数的相加,直到处理完较长的那个整数。

  10. c[lenc] = a1[lenc] + b1[lenc] + x;:将a1b1中相应位置的数字相加,并加上前一位的进位x,然后将结果存储在c数组中。

  11. x = c[lenc] / 10;:计算当前位的进位,并将结果存储在变量x中。

  12. c[lenc] %= 10;:将当前位的结果限制在0到9之间,以确保它只存储一个数字。

  13. lenc++;:递增lenc,以处理下一位。

  14. c[lenc] = x;:在循环结束后,将最后的进位存储在c数组中的最高位。

  15. 最后一个循环通过逆序打印c数组中的结果,输出了相加后的大整数。

这段代码最终输出了相加后的结果。注意,这是一个基本的高精度加法实现,可以处理非常大的整数,但对于更复杂的高精度运算,可能需要更多的代码和优化。

b1[i]=b[lenb-i]-‘0’;中为什么要-‘0’ ?

在这段代码中,b 是一个字符数组,用于存储大整数的每一位数字的字符表示,例如,字符 '4' 表示数字 4。C++中,字符表示的数字在ASCII码中有相应的整数值,字符 '0' 的ASCII码值是 48,字符 '1' 的ASCII码值是 49,以此类推。

所以,为了将字符 '4'(或其他数字字符)转换为相应的整数值,我们需要从字符的ASCII码值中减去 '0' 的ASCII码值,即 '4' - '0',这将得到整数 4。这是一个常见的方式,将字符表示的数字转换为整数,因为它们在ASCII码中是连续的。

因此,b1[i] = b[lenb - i] - '0'; 这行代码的目的是将字符数组 b 中的字符数字转换为整数,并存储在 b1 数组中,以便进行高精度加法操作。

再分别用java和python写一下

当用Java编写高精度加法时,可以使用Java的BigInteger类,这个类可以处理非常大的整数。以下是一个Java示例:

import java.math.BigInteger;
import java.util.Scanner;

public class HighPrecisionAddition {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入第一个正整数: ");
        String num1 = scanner.next();
        System.out.print("请输入第二个正整数: ");
        String num2 = scanner.next();

        BigInteger bigNum1 = new BigInteger(num1);
        BigInteger bigNum2 = new BigInteger(num2);
        BigInteger sum = bigNum1.add(bigNum2);

        System.out.println("它们的和是: " + sum);
    }
}

这个Java程序首先导入BigInteger类,然后让用户输入两个正整数,将它们转换成BigInteger对象,执行加法操作,然后输出结果。

接下来是Python的高精度加法示例,Python中可以使用内置的整数类型,它们可以自动处理大整数:

num1 = int(input("请输入第一个正整数: "))
num2 = int(input("请输入第二个正整数: "))

sum = num1 + num2

print("它们的和是:", sum)

这个Python程序直接让用户输入两个正整数,然后执行加法操作,最后输出结果。Python的整数类型可以自动处理大整数,因此不需要额外的库或类型转换。

你可能感兴趣的:(#,算法面试题,#,信息学奥赛,算法,c++,java)