C++ 两个高精度数相乘

部署运行你感兴趣的模型镜像
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N=1000;
int main()
{
   string s1,s2;
   int a[N],b[N],sum[N];
   int l1,l2;
   cin>>s1>>s2;
   l1=s1.length();
   l2=s2.length();
   memset(a,0,sizeof(a));
   memset(b,0,sizeof(b));
   memset(sum,0,sizeof(sum));

   for(int i=0;i<l1;i++)    //将字符串倒置并转换成数串
    a[i]=s1[l1-i-1]-'0';
   for(int i=0;i<l2;i++)
    b[i]=s2[l2-i-1]-'0';

    int start;
    for(int i=0;i<l1;i++)
    {
        start=i;               //start实现错位
        for(int j=0;j<l2;j++)
        {
            sum[start++]+=a[i]*b[j];
        }
    }

    for(int i=0;i<start;i++)
    {
        sum[i+1]+=sum[i]/10;
        sum[i]=sum[i]%10;
    }
    if(sum[start]==0) start--;
    for(int i=start;i>=0;i--)
        printf("%d",sum[i]);
   return 0;
}


您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### 高精度多个大相乘的实现方法 在C++中,高精度计算通常涉及对大的模拟运算,尤其是当字的大小超出了标准据类型(如`int`或`double`)所能表示的范围时。对于多个大相乘的情况,可以通过组或字符串来存储每个数字,并手动实现乘法逻辑。 #### 实现思路 1. **据存储**:将每个大存储为字符串或字符组,每一位字作为单独的字符存储。 2. **初始化结果组**:创建一个足够大的组来存储中间结果和最终结果。 3. **逐位相乘**:对每一个输入的大进行逐位相乘,并将结果累加到结果组中。 4. **进位处理**:在每一步乘法和加法操作后,处理进位问题。 5. **输出结果**:将结果组中的字转换为字符串并输出。 #### 代码示例 以下是一个简单的示例,展示如何在C++中实现多个大相乘: ```cpp #include <iostream> #include <vector> #include <string> std::string multiply(const std::string& num1, const std::string& num2) { int n1 = num1.size(); int n2 = num2.size(); std::vector<int> result(n1 + n2, 0); for (int i = n1 - 1; i >= 0; --i) { for (int j = n2 - 1; j >= 0; --j) { int mul = (num1[i] - '0') * (num2[j] - '0'); int sum = mul + result[i + j + 1]; result[i + j + 1] = sum % 10; result[i + j] += sum / 10; } } std::string res; for (int num : result) { if (!(res.empty() && num == 0)) { res.push_back(num + '0'); } } return res.empty() ? "0" : res; } std::string multiplyMultiple(const std::vector<std::string>& nums) { if (nums.empty()) return "0"; std::string result = nums[0]; for (size_t i = 1; i < nums.size(); ++i) { result = multiply(result, nums[i]); } return result; } int main() { std::vector<std::string> numbers = {"12345678901234567890", "98765432109876543210", "12345678901234567890"}; std::string result = multiplyMultiple(numbers); std::cout << "Result: " << result << std::endl; return 0; } ``` #### 解释 - **multiply函**:实现了两个相乘的逻辑。通过遍历两个字符串的每一位,进行逐位相乘,并将结果存储在一个临时组中。 - **multiplyMultiple函**:扩展了`multiply`函的功能,以支持多个大相乘。它依次将每个数字与当前结果相乘。 - **main函**:展示了如何使用这些函来计算多个大的乘,并输出结果[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值