乘积尾零(高精度相乘)

题解: 有一种属于我自己的解法就是高精度相乘解法,若是熟悉高精度相乘的话一点也不麻烦,当然正经解法更能省却时间.
在此讲解,正经解法的思路,高精度相乘的解法,可以自己去上网学习高精度相乘再加点编程逻辑就可以做到(笨方法)
①做过滚动数组题目一定会熟悉这种做法:将这些数相乘,为了防止爆精度我们可以对每个数取其0位数和0位数的前四位,很简单就做出来了。
②分解质因数类似思维:其实0就是2*5产生的,为什么不是4和5还是什么5和6其他的,这就是分解质因数的思维,首先产生0的乘法肯定有5,5是质因数,另一位其实一直都是2的质因数,4也好,6也好,这些都能被质因数2分解,也就是说我们只要将每个数分解成只有2和5的形式并统计2的个数和5的个数就能解决问题。
只插入高精度的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 10000
//高精度乘法暴力大法解决

char a[M];
int num1[M];
int num2[M];
int num[M];

void fun(char *str1,char *str2)
{
    int i,j;
    for(i=0;i<strlen(str1);i++)
        num1[i] = str1[strlen(str1)-1-i]-'0';
    for(j=0;j<strlen(str2);j++)
       num2[j] = str2[strlen(str2)-1-j]-'0';

    int r;
    for(i=0;i<strlen(str1);i++)
    {
        r=0;
        for(j=0;j<strlen(str2);j++)
        {
            num[i+j]+=num1[i]*num2[j]+r;
            r=num[i+j]/10;
            num[i+j]%=10;
        }
        num[i+j]+=r;
    }
    for(i=M-1;i>=0;i--)
        if(num[i]!=0)
          break;
    for(j=0;j<=i;j++)
           str1[j]=num[i-j]+'0';
    str1[j]='\0';   //注意:字符串最后一位是结束符
    for(i=0;i<M;i++)
        num[i]=0;
}

int main()
{
    char sum[M],count=0;
    for(int i=0;i<M-1;i++)
        sum[i] = '0';
    scanf("%s",sum);

    for(int i=0;i<99;i++)
    {
        scanf("%s",a);
        fun(sum,a);
    }
    puts(sum);
    for(int j=strlen(sum)-1;j>=0;j--)
        {
            if(sum[j]!='0')
                break;
            count++;
        }
    printf("%d",count);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用整型数组类实现两个96位整数高精度相乘的函数的示例代码: ``` #include <iostream> #include <vector> using namespace std; class IntArray { public: IntArray(int size) : array(size) {} int& operator[](int index) { return array[index]; } const int& operator[](int index) const { return array[index]; } int size() const { return array.size(); } void resize(int size) { array.resize(size); } private: vector<int> array; }; IntArray multiply(const IntArray& a, const IntArray& b) { const int size = a.size() + b.size(); IntArray result(size); for (int i = 0; i < a.size(); ++i) { for (int j = 0; j < b.size(); ++j) { result[i + j] += a[i] * b[j]; } } for (int i = 0; i < size - 1; ++i) { result[i + 1] += result[i] / 1000000000; result[i] %= 1000000000; } while (result.size() > 1 && result.back() == 0) { result.resize(result.size() - 1); } return result; } int main() { IntArray a(3); a[0] = 123456789; a[1] = 987654321; a[2] = 555555555; IntArray b(3); b[0] = 111111111; b[1] = 222222222; b[2] = 333333333; IntArray c = multiply(a, b); for (int i = c.size() - 1; i >= 0; --i) { cout << c[i]; } cout << endl; return 0; } ``` 在上面的代码中,我们定义了一个整型数组类 `IntArray`,它封装了一个 `vector<int>` 对象,并提供了一些操作接口。其中,`multiply` 函数接受两个 `IntArray` 对象作为参数,计算它们的乘积并返回结果。使用两层循环遍历两个整数的每一位,将它们的乘积加到结果数组的相应位置。然后,我们遍历结果数组并对进位进行处理,最后删除结果数组末尾的多余零。在主函数中,我们定义了两个 `IntArray` 对象,并调用 `multiply` 函数计算它们的乘积。最后,我们反向输出结果数组的每一位。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值