大数乘法

community_1985 2021-11-22 14:54:04

对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现有类型,但是把大整数的运算化解为若干小整数的运算,即所谓:“分块法”。


上图表示了分块乘法的原理。可以把大数分成多段(此处为2段)小数,然后用小数的多次运算组合表示一个大数。可以根据int的承载能力规定小块的大小,比如要把int分成2段,则小块可取10000为上限值。注意,小块在进行纵向累加后,需要进行进位校正。

请从以下四个选项中选择正确答案,填补在空白处,使得代码能运行后能产生正确的结果。

提示:

十进制数的进位问题
#include <bits/stdc++.h>
using namespace std;

void bigmul(int x, int y, int r[])
{
    int base = 10000;
    int x2 = x / base;
    int x1 = x % base;
    int y2 = y / base;
    int y1 = y % base;

    int n1 = x1 * y1;
    int n2 = x1 * y2;
    int n3 = x2 * y1;
    int n4 = x2 * y2;

    r[3] = n1 % base;
    r[2] = n1 / base + n2 % base + n3 % base;
    r[1] = __________________;
    r[0] = n4 / base;

    r[1] += r[2] / base;
    r[2] = r[2] % base;
    r[0] += r[1] / base;
    r[1] = r[1] % base;
}

int main(int argc, char *argv[])
{
    int x[] = {0, 0, 0, 0};

    bigmul(87654321, 12345678, x);

    printf("%d%d%d%d\n", x[0], x[1], x[2], x[3]);

    return 0;
}

返回练习题答题页面

...全文
467 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
westdata-Tm 2023-11-17
  • 打赏
  • 举报
回复
r0 r1图片和代码的数组下标,好像错了一位。
CSDN-Ada助手 2023-12-26
  • 举报
回复
@westdata-Tm 感谢您的提醒!您是指在代码中将数组下标从0开始计数吗?如果是的话,我会进行相应的调整。
B_256 2023-07-18
  • 打赏
  • 举报
回复

#include<bits/stdc++.h>
using namespace std;
int main(){
    string sa,sb;
    int a[2100]={0},b[2100]={0},c[2100]={0};
    int lena,lenb,i,j;
    cin>>sa;
    cin>>sb;
    lena=sa.size();
    lenb=sb.size();
    for(i=0;i<lena;i++){
        a[i]=sa[lena-1-i]-'0';
    }
    for(i=0;i<lenb;i++){
        b[i]=sb[lenb-1-i]-'0';
    }
    for(i=0;i<lena;i++){
        for(j=0;j<lenb;j++){
            c[i+j]=c[i+j]+a[i]*b[j];
        }
    } 
    for(i=0;i<lena+lenb;i++){
        if(c[i]>=10){
            c[i+1]=c[i+1]+c[i]/10;
            c[i]%=10;
        }
    }
    int len=lena+lenb-1;
    while(c[len]==0&&len>0){
        len--;
    }
    for(i=len;i>=0;i--){
        cout<<c[i];
    }
    return 0;
    }
//这个逻辑更好懂一些,就是时间复杂度较高

CSDN-Ada助手 2023-07-18
  • 举报
回复
@B_256 这段代码是一个实现大数乘法的算法,使用了分块法,将大整数分成若干小整数进行运算。算法的逻辑基本正确,但是在第9行和第15行的代码有一些问题,应该修改为以下形式: for(i=0;i<lena;i++){ a[lena-1-i]=sa[i]-'0'; } for(i=0;i<lenb;i++){ b[lenb-1-i]=sb[i]-'0'; } 这样才能正确地将字符串转化为整数数组。另外,代码的最后一行应该修改为: cout<<c[i]; 这样才能正确地输出结果。希望对你有帮助!
画南浦云 2022-10-27
  • 打赏
  • 举报
回复
算出来的结果和计算器算出来的不一致,不知道咋回事,也不满足乘法交换率,不知道啥原因
林默0706 2023-02-08
  • 举报
回复
@画南浦云 是一致的啊
  • 打赏
  • 举报
回复 1
其实这道题很简单,图片都给出来了,我们只需要照着图片写,就OK,写博客了
正心 2021-12-20
  • 打赏
  • 举报
回复 4

上述题目给出的是两个乘数每一位都非0,若乘数中连续多个位置为0,比如1000000*1000000,如果按java代码逻辑实现,在进位之后还需要处理单个数块字符串不足的问题,否则可能结果不准确。

ToTensor 2021-12-23
  • 举报
回复 2
@正心 感谢大佬提醒
易小侠 2022-01-17
  • 举报
回复
@正心 多谢大佬
正心 2022-01-17
  • 举报
回复
@易小侠 不是大佬,互相学习

11

社区成员

发帖
与我相关
我的任务
社区管理员
  • community_1985
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧