1 条题解

  • 0
    @ 2025-4-12 20:43:47

    题意分析

    题目要求输入两个不超过40位的正整数,计算它们的乘积,并以没有前导零的常规数字形式输出。由于数字位数较大,不能直接使用基本数据类型进行计算,需要采用高精度计算的方法,手动模拟乘法运算过程。

    解题思路

    1.输入两个正整数,以字符串形式存储。

    2.将字符串形式的数字倒序存储到数组中,方便从低位到高位进行计算。

    3.模拟乘法运算,通过两层循环,将两个数的每一位相乘,并考虑进位。

    4.处理乘积结果中的进位,得到最终的结果数组。

    5.去掉结果数组中的前导零。

    6.倒序输出结果数组,得到最终的乘积。

    分析

    1.由于数字位数较大,使用字符串存储数字,然后转换为数组进行计算。

    2.模拟乘法运算时,按照乘法的计算规则,将一个数的每一位与另一个数的每一位相乘,再加上进位,得到对应位置的结果。

    3.计算过程中,需要处理进位,确保结果的准确性。

    4.最后,需要去掉结果数组中的前导零,以满足题目输出要求。

    实现步骤

    1.定义字符数组 str1 和 str2 用于存储输入的两个数字字符串,定义整数数组 t1、t2 和 a 用于存储转换后的数字和计算结果。

    2.用 cin 读取输入的两个数字字符串,计算字符串长度 len1 和 len2。

    3.将字符串 str1 和 str2 中的字符转换为数字,并倒序存储到数组 t1 和 t2 中。

    4.进行乘法运算,通过两层 for 循环,计算 t1 和 t2 中每一位数字的乘积,并加上进位,将结果存储到数组 a 中。

    5.处理数组 a 中的进位,确保每一位数字都在0到9之间。

    6.计算结果数组 a 的有效长度 lena,去掉前导零。

    7.倒序输出数组 a 中有效的数字,得到最终的乘积。

    代码实现

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    char str1[100], str2[100];
    int t1[100], t2[100], a[200];  // Increased array size for product
    
    int main() {
        cin >> str1 >> str2;
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        
        // Reverse store (starting from index 1)
        for (int i = 0; i < len1; i++) {
            t1[len1 - i] = str1[i] - '0';
        }
        
        for (int i = 0; i < len2; i++) {
            t2[len2 - i] = str2[i] - '0';
        }
        
        // Multiply
        for (int i = 1; i <= len1; i++) {
            int carry = 0;
            for (int j = 1; j <= len2; j++) {
                a[i + j - 1] += carry + t1[i] * t2[j];
                carry = a[i + j - 1] / 10;
                a[i + j - 1] %= 10;
            }
            a[i + len2] = carry;
        }
        
        // Calculate result length
        int lena = len1 + len2;
        while (a[lena] == 0 && lena > 1) lena--;
        
        // Output result
        for (int i = lena; i >= 1; i--) {
            cout << a[i];
        }
        cout << endl;
        
        return 0;
    }
    

    代码说明

    #include<iostream>
    #include<string.h>
    using namespace std;
    //大整数乘法
    char str1[100],str2[100];
    int t1[100],t2[100],a[100];
    int main(){
        cin>>str1>>str2; // 读取两个数字字符串
        int len1=strlen(str1); // 计算第一个字符串长度
        int len2=strlen(str2); // 计算第二个字符串长度
        //倒序保存
        //从1开始
        for(int i=0;i<len1;i++){
            t1[len1-i]=str1[i]-'0'; // 将第一个字符串字符转换为数字并倒序存储
        }
        
        for(int i=0;i<len2;i++){
            t2[len2-i]=str2[i]-'0'; // 将第二个字符串字符转换为数字并倒序存储
        }
        
        for(int i=1;i<=len1;i++){
            int x=0;  // 进位
            for(int j=1;j<=len2;j++){
                a[i+j-1]+=x+t1[i]*t2[j]; // 计算乘积并加上进位,累加到对应位置
                x=a[i+j-1]/10; // 计算进位
                a[i+j-1]=a[i+j-1]%10; // 保留个位数字
            }
            a[i+len2]=x; // 处理最后一位的进位
        }
        //乘法位数相加
        int lena=len1+len2;
        //去掉前导0  存的时候在后面
        while(a[lena]==0 && lena>1) lena--; // 去掉前导零,更新有效长度
        for(int i=lena;i>=1;i--){
            cout<<a[i]; // 倒序输出结果
        }
        cout<<endl;
        
        return 0;
    }
    

    代码中,首先读取输入的两个数字字符串,然后将其转换为倒序存储的数字数组。通过两层循环模拟乘法运算,计算每一位的乘积并处理进位。最后,去掉结果数组中的前导零,倒序输出结果数组,得到最终的乘积。

    • 1

    信息

    ID
    1390
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    17
    已通过
    1
    上传者