【大整数乘法】

article/2025/9/14 5:12:51

  1. 问题

 

2.伪代码

  • 理想情况下,XY位数相同
Mul(long long x,long long y,int num){Fh<--(x*y>0)?1:-1;x<--|x|; y<--|y|;if(num == 0)then return 0;else if(num==1) then return fh*x*y;else{x_high<--x/10^(num/2);x_low<--x mod 10^(num/2);y_high<--y/10^(num/2);y_low<--y_mod 10^(num/2);High<--mul(x_high,y_high, num/2);Low<--mul(x_low,y_low,num/2);Mid<--mul((x_high-x_low),(y_low-y_high),num/2)+High+Low;return fh* High*10^num +Mid*10^(num/2)+Low;}
}
Main(){Input:A,B;Temp<--A;While(temp) do{n++;temp<--temp/10;
}Return mul(a,b,n);
}

       

  • 非理想情况下,XY位数不同
Mul(long long x, int numx, long long y, int numy){Fh<--(x*y>0)?1:-1;x<--|x|; y<--|y|;if(numx == 0 || numy == 0) then return 0;else if((numx == 1 && numy == 1) || numx == 1 || numy == 1) then return fh*x*y;else{x_low <-- numx / 2;x_high<-- numx - x_low;y_low <-- numy / 2;y_high<-- numy - y_low;//记录XY分的高低位的位数。A <-- x / 10^x_low;B <-- x % 10^x_low;C <-- y / 10^y_low;D <-- y % 10^y_low;//获取XY的高低位的数值。AC<--mul(A, x_high, C, y_high);BD<-- mul(B, x_low, D, y_low);ABCD<--mul(( (A *10^x_low) - B), x_high, (D - (C * 10^y_low)), y_high);return fh * (2 * AC * 10^(x_low+y_low) + ABCD + 2 * BD);}
} 
Main(){Input:A,B;Temp<--A;
While(temp) do{n1++;temp<--temp/10;
}
Temp<--B;
While(temp) do{n2++;temp<--temp/10;
}Return mul(a,n1,b,n2);
}

  1. 源代码及结果
  • 理想情况下,XY位数相同
#include<bits/stdc++.h>
using namespace std;
#define sign(x) ((x>0)? 1:-1)long long mul(long long x,long long y,int num){int fh=sign(x)*sign(y);x=x>0?x:-x;y=y>0?y:-y;if(num==0)return 0;else if(num==1)		return fh*x*y;else{long long x_high=x/(int)pow(10,(int)(num/2));long long x_low=x%(int)pow(10,(int)(num/2));long long y_high=y/(int)pow(10,(int)(num/2));long long y_low=y%(int)pow(10,(int)(num/2));long long High=mul(x_high,y_high,(int)(num/2));long long Low=mul(x_low,y_low,(int)(num/2));long long Mid=mul((x_high-x_low),(y_low-y_high),(int)(num/2))+High+Low;return fh*(long long)(High*pow(10,(int)(num/2)+(int)(num/2))+Mid*pow(10,(int)(num/2))+Low);}
}
int main(){long long a,b,c,temp;int n=0;while(cin>>a>>b){temp=a;while(temp){n++;temp=temp/10;}c=mul(a,b,n);cout<<c<<endl;}return 0;
}

运行结果:

 

  • 非理想情况下,XY位数不同
#include <bits/stdc++.h>
using namespace std;
#define sign(x) ((x>0)? 1:-1)long long  mul(long long x, int numx, long long y, int numy) {int fh = sign(x) * sign(y);x = x > 0 ? x : -x;y = y > 0 ? y : -y;if (numx == 0 || numy == 0)return 0;else if ((numx == 1 && numy == 1) || numx == 1 || numy == 1) {return fh * x * y;} else {int x_low = numx / 2;int x_high = numx - x_low;int y_low = numy / 2;int y_high = numy - y_low;long long A = x / (int)pow(10, x_low);long long B = x % (int)pow(10, x_low);long long C = y / (int)pow(10, y_low);long long D = y % (int)pow(10, y_low);long long AC = mul(A, x_high, C, y_high);long long BD = mul(B, x_low, D, y_low);long long ABCD = mul(((long long)(A * pow(10, x_low)) - B), x_high, (D - (long long)(C * pow(10, y_low))), y_high);return fh * (long long)(2 * AC * pow(10, (x_low + y_low)) + ABCD + 2 * BD);}
}int main() {long long a, b, c, temp;int n1 = 0, n2 = 0;while (cin >> a >> b) {temp = a;while (temp) {n1++;temp = temp / 10;}temp = b;while (temp) {n2++;temp = temp / 10;}c = mul(a, n1, b, n2);cout << c << endl;n1 = 0;n2 = 0;}return 0;
}

运行结果:

 

4.分析

①理想情况下,XY位数相同时:

 

如图所示,即X=A*10^(n/2)+B ,Y=C*10^*(n/2)+D;

 本来可以直接算(AD+BC),但是这样效率变低了,所以对(AD+BC)进行分解优化后得:

②非理想情况下,XY位数不同时:

 当XY位数不相同时,我们采用分治法将它拆分为A与B、C与D,因为位数不相同,所以此时我们就要先获取分完之后XY高低位的位数与高低位的值,此时:

XY=(A*10^x_low+B)*(C*10^y_low+D)

    =AC*10^(x_low+y_low)+(AD*10^x_low+BC*10^y_low)+BD

中间那部分进行分解优化后得:

ABCD=(A*10^x_low-B)(D-C*10^y_low)

=AD*10^x_low-AC*10^(x_low+y_low)-BD+BC*10^y_low;

则AD*10^x_low+BC*10^y_low

=ABCD+ AC*10^(x_low+y_low)+BD;

所以

XY= 2*AC*10^(x_low+y_low)+ABCD+2*BD

所以最后的返回值为:

fh * (2 * AC * pow(10, (x_low + y_low)) + ABCD + 2 * BD);


http://chatgpt.dhexx.cn/article/p57bYGf9.shtml

相关文章

大整数乘法(大整数乘int型)

算法思想&#xff1a; 1.将大整数倒序储存到数组中&#xff08;方便进位&#xff09; 2.对同位相乘后的数取模10&#xff0c;推入结果数组中 3.对同位相乘后的数除以10&#xff0c;作为进位 5.去除可能出现的前导零 4.完成乘法后倒序输出 补充知识&#xff1a; 1、vector相关用…

C语言实现大整数乘法

转载自&#xff1a;点击打开链接 乘法规律&#xff0c;一个数的第i位和另一个数的第j位相乘&#xff0c;一定会累加到结果的第ij位&#xff0c;结果的数组一个数组元素存2位数&#xff0c;最后对结果处理进位&#xff0c;最后打印出来 方法一见上面链接https://www.cnblogs.c…

大整数乘法(简单模拟乘法过程)

一、分析 整数的数值超过计算机硬件所能表示的最大值时&#xff0c;那么我们只能借助软件的方法来实现大整数的乘法了。 我们可以使用字符串来模拟大整数的乘法&#xff0c;算法的思想就是使用我们在小学时学过的乘法&#xff0c;一位位相乘&#xff0c;最后计算出结果。如下&…

算法总结——大整数乘法

问题描述 求两个不超过200位的非负整数的积。 输入数据 有两行&#xff0c;每行是一个不超过200位的非负整数&#xff0c;没有多余的前导0。 输出要求 一行&#xff0c;即相乘后的结果。结果里不能有多余的前导0&#xff0c;即如果结果是342&#xff0c;那么就不能输出为0342。…

大整数的乘法(分治法)

通常执行一次加法或乘法运算所需的计算时间看作一个仅取决于计算机硬件处理速度的常数。这个仅在参加运算的整数能在计算机硬件对整数的表示范围内直接处理才是合理的。若要精确地表示大整数并在计算结果中要求精确得到所有位数上的数字&#xff0c;就必须用软件的方法来实现大…

分治法-大整数乘法

问题分析&#xff1a; 在计算机上处理一些大数据相乘时&#xff0c;由于计算机硬件的限制&#xff0c;不能直接进行相乘得到想要的结果。可以将一个大的整数乘法分而治之&#xff0c;将大问题变成小问题&#xff0c;变成简单的小数乘法再进行合并&#xff0c;从而解决上述问题…

大整数乘法

设计一个有效的算法&#xff0c;可以计算两个n位大整数的乘法运算。 如果按照我们日常的计算方法&#xff0c;应该就是将两个数逐位相乘&#xff0c;最后加起来得到最终的结果。由于是大整数乘法&#xff0c;那么我们用string来存储这两个数&#xff0c;因为是要做乘法&#x…

大整数乘法算法

一 转换为二进制求&#xff0c;推导出的公式适合十进制计算 设X和Y都是n位的二进制整数&#xff0c;现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法&#xff0c;但是这样做计算步骤太多&#xff0c;显得效率较低。如果将每2个1位数的乘法或加法看…

大整数乘法的详解

一.问题 由于编程语言提供的基本数值数据类型表示的数值范围有限&#xff0c;不能满足较大规模的高精度数值计算&#xff0c;因此需要利用其他方法实现高精度数值的计算&#xff0c;于是产生了大数运算。尤其是乘法运算&#xff0c;下面就是大整数的乘法的过程&#xff08;加 …

Ubuntu server树莓派版本默认用户名密码及密码修改

树莓派安装的Ubuntu server镜像&#xff0c; 默认的初始用户及密码&#xff1a; ubuntu # user ubuntu # passwd默认信息查看 在烧入镜像的内存卡中&#xff0c; 可以查看到默认的用户信息 默认密码修改 在登录界面 输入初始化的用户名和密码后&#xff0c; 会提示是第一…

2022.04.04树莓派最新镜像问题,树莓派如何设置初始化的账户和密码

树莓派最新的arm64位系统&#xff0c;更新时间是2022年4月4日&#xff0c;这个版本的树莓派取消了默认的账户密码&#xff0c;也就是原来一直使用的pi和对应的默认密码raspberry被取消了&#xff0c;现在如果想要使用的话必须自己设置&#xff0c;下面有两种方法可以设置自己的…

树莓派启用无密码 sudo

启用无密码 sudo&#xff0c;可以在不提供密码的情况下在树莓派上运行程序。 登录 Raspberry Pi 命令行界面。假设 Raspberry Pi 的默认用户名和密码分别为 pi 和 raspberry。在命令行界面中&#xff0c;键入以下命令&#xff1a; sudo nano /etc/sudoers 3. 通过添加以下行启…

最新树莓派系统PUTTY用默认用户名和密码登录不上的解决方法

最近我在树莓派配置深度学习环境&#xff0c;然后直接载了别的博主的树莓派镜像&#xff0c;发现博主给的用户名&#xff0c;密码登不上&#xff0c;于是乎&#xff0c;就打算自己配置深度学习环境&#xff0c;结果我下在了最新版本的树莓派镜像系统&#xff08;2022-04-04-ras…

树莓派默认账号密码串口登录不了的Bug解决

一、问题总结 我用的树莓派型号是树莓派Pi3,刷机用的镜像是2023版的&#xff0c;23版的镜像文件较大8G的SD卡不够用 问题描述&#xff1a;刷完机在用串口登录树莓派的时候登录不了 &#xff01;&#xff01;&#xff01; 默认账号&#xff1a;pi 默认密码&#xff1a;raspb…

树莓派raspberry pi 4 SSH默认密码无法登录解决办法

以前玩过一段时间树莓派&#xff0c;只要开通ssh就可以&#xff0c;默认用户pi,默认密码: raspberry。 远程连接就可以。 但今天再玩却死活无法登录&#xff0c;如下&#xff1a; 出了什么幺蛾子哦&#xff1f;&#xff01;&#xff01; 上网一查&#xff0c;才知道pi账号在…

【入坑树莓派】烧录系统都烧录了三次(树莓派默认账户密码错误/已删除)

为什么会烧录了三次&#xff1f;我因为实在不知道问题出在哪&#xff0c;所以只能推倒重来三次。。。 三次&#xff0c;两次连接不上WiFi&#xff0c;好不容易一次连接上了&#xff0c;出现了下面这幅画面 再三确认了默认用户名是pi&#xff0c;密码raspberry&#xff0c;奈何…

树莓派用默认账号和密码登录不上怎么办;修改树莓派的密码

目录 一、重置树莓派的默认账号和密码 二、修改树莓派的密码 三、超级用户和普通用户的切换 一、重置树莓派的默认账号和密码 在SD卡中根目录建立文件userconf 在userconf中输入如下内容&#xff1a; pi:$6$/4.VdYgDm7RJ0qM1$FwXCeQgDKkqrOU3RIRuDSKpauAbBvP11msq9X58c8Q…

树莓派默认密码_树莓派介绍:没有显示器,怎样远程控制树莓派?

树莓派(Raspberry Pi)是学习计算机知识、架设服务器的好工具&#xff0c;价格低廉&#xff0c;可玩性高。 由于树莓派系统开始时默认是不开启ssh连接的&#xff0c;没有开启ssh就无法连接电脑&#xff0c;后续的操作也就无从谈起。 准备工作 1.烧录好系统的树莓派3B主板 2.普…

树莓派默认密码_树莓派快速指南,从购买到开机

本文给树莓派初学者&#xff0c;或者准备入手树莓派的同学看&#xff0c;主要包括什么是树莓派&#xff0c;入门树莓派需要那些配件&#xff0c;如何烧录树莓派系统&#xff0c;和树莓派的开机指南。如果你不知道学习树莓派需要那些配件&#xff0c;或者购买了树莓派不知道怎么…

树莓派的登录

一、串口登录&#xff1a; 由于树莓派在默认情况下&#xff0c;树莓派的串口和蓝牙链接。而我们要进行串口登录就得断开蓝牙&#xff0c;把串口用来进行数据通信。 1.打开SD卡根目录的"config.txt"文件&#xff0c;将以下内容添加在最后并且保存。 dtoverlaypi3-m…