class NodeData
{
public:
NodeData* next;
char num;
NodeData() {num = '0'; next = NULL;}
};
NodeData* SetUpLinkList()
{
NodeData* head = new NodeData;
bool is_add = true;
char data = 0;
NodeData* p = head;
while(1) {
cin >> data;
if ('a' == data ) break;
NodeData* cur = new NodeData;
cur->num = data;
cur->next = NULL;
p->next = cur;
p = cur;
}
NodeData* tmp = head;
head = head->next;
delete tmp;
return head;
}
NodeData* ReverseLink(NodeData*a)
{
NodeData* res = NULL;
if (NULL == a) return NULL;
NodeData* head = a;
NodeData* p = a;
NodeData* q = a->next;
while (NULL != q) {
NodeData* r = q->next;
q->next = p;
p = q;
q = r;
}
head->next = NULL;
res = p;
return res;
}
int digital_atoi(char chr)
{
return chr - '0';
}
char digital_itoa(int i)
{
return i + '0';
}
NodeData* Multiply(NodeData* a, NodeData* b)
{
NodeData* total = NULL;
if (NULL == a ||
NULL == b) return NULL;
NodeData* fir = ReverseLink(a);
NodeData* sec = ReverseLink(b);
int count = 0;
while (NULL != sec) {
int m = digital_atoi(sec->num);
int flow = 0;//进位
NodeData* head = new NodeData;
NodeData* p = head;
NodeData* left = fir;
while (NULL != left) {
int n = digital_atoi(left->num);
int subtotal = m * n;
int y = (subtotal + flow) % 10;
flow = (subtotal + flow) / 10;
NodeData* node = new NodeData;
node->num = digital_itoa(y);
p->next = node;
p = node;
left = left->next;
}
if (0 != flow) {
NodeData* node = new NodeData;
node->num = digital_itoa(flow);
p->next = node;
p = node;
}
//根据乘法竖式,得到某一位与被乘数相乘的结果,并且将此结果的低位用0补齐
NodeData* subtotal_head = new NodeData;
p = subtotal_head;
for (int i = 0; i < count; i++)
{
NodeData* node = new NodeData;
node->num = '0';
node->next = NULL;
p->next = node;
p = node;
}
p->next = head->next;
delete head;
NodeData* del_node = subtotal_head;
subtotal_head = subtotal_head->next;
delete del_node;
//算完了某一位的乘法后,将其结果与当前的total相加
NodeData* sum_head = new NodeData;
sum_head->next = NULL;
NodeData* tmp = sum_head;
flow = 0;
bool bflag_added = false;
while (NULL != total &&
NULL != subtotal_head) {
bflag_added = true;
int n = digital_atoi(total->num);
int m = digital_atoi(subtotal_head->num);
int sum = m + n;
int y = (sum + flow) % 10;
flow = (sum + flow) / 10;
NodeData* node = new NodeData;
node->num = digital_itoa(y);
node->next = NULL;
tmp->next = node;
tmp = node;
total = total->next;
subtotal_head = subtotal_head->next;
}
if (NULL != sum_head->next) {
del_node = sum_head;
sum_head = sum_head->next;
delete del_node;
}
//上面加完后,可能有进位,有可能部分没加完
if (bflag_added) {
NodeData* continue_node = NULL;
if (NULL != subtotal_head) {
continue_node = subtotal_head;
} else if (NULL != total) {
continue_node = total;
} else {
//Do nothing
}
while (NULL != continue_node)
{
int n = digital_atoi(continue_node->num);
int sum = n + flow;
int y = sum % 10;
flow = sum / 10;
NodeData* node = new NodeData;
node->num = digital_itoa(y);
tmp->next = node;
tmp = node;
continue_node = continue_node->next;
}
if (0 != flow) {
NodeData* node = new NodeData;
node->num = digital_itoa(flow);
node->next = NULL;
tmp->next = node;
}
//删除临时结点
while (NULL != subtotal_head) {
del_node = subtotal_head;
subtotal_head = subtotal_head->next;
delete del_node;
}
while (NULL != total) {
del_node = total;
total = total->next;
delete del_node;
}
} else {
sum_head = subtotal_head;
}
total = sum_head;
count++;
sec = sec->next;
}
total = ReverseLink(total);
return total;
}
int _tmain(int argc, _TCHAR* argv[])
{
NodeData*left = SetUpLinkList();
NodeData*right = SetUpLinkList();
NodeData* res = Multiply(left, right);
while (NULL != res) {
cout << res->num;
res = res->next;
}
while (NULL != res) {
NodeData* del_node = res;
res = res->next;
delete del_node;
}
}相关推荐
保姆级教程:用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信(附完整代码)
本文详细介绍了如何利用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信,涵盖硬件连接、寄存器配置、时序优化及FPGA接口设计等关键步骤。通过实例代码和调试技巧,帮助开发者快速掌握高效数据交互技术,提升嵌入式系统设计能力。
HDU1402 A * B Problem Plus 大数相乘模板
A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26459 Accepted Submission(s): 6927 Problem Description Calculate A * B...
STM32F103C8T6+HX711实战:从零打造智能体重秤(附OLED显示与语音播报)
本文详细介绍了基于STM32F103C8T6微控制器和HX711称重模块,从零构建智能体重秤的完整实战教程。内容涵盖硬件选型、系统架构、驱动编写、数据滤波校准算法,并实现了OLED显示与语音播报功能。该项目是嵌入式学习的综合性实践,尤其适合作为毕业设计课题,帮助开发者掌握传感器应用、数据处理及人机交互等核心技能。
高精度 大数加法 乘法 除法 幂 模板
高精度 大数加法 乘法 除法 幂 模板
ENVI5.6+SARscape实战:基于哨兵一号的PS与SBAS时序InSAR地表形变监测全流程解析
本文详细解析了使用ENVI5.6和SARscape软件基于哨兵一号数据进行PS与SBAS时序InSAR地表形变监测的全流程。从数据获取、预处理到PS-InSAR和SBAS-InSAR处理,提供了实用技巧和优化建议,帮助用户高效完成地表形变监测任务。
2025年MathorCup数学应用挑战赛【B题完整论文】附参考代码(免费分享)
摘。
大数与小数模板(乘法,加法)
代码:#include <stdio.h> #include <string.h> //大数乘小数 void mult(char c[],int m,char t[]) { char s[100]; int len=strlen(c); for(int i=0; i<len; i++) s[len-i-1]=c[i]-'0';
装配完整性检查系统:基于YOLOv10的螺丝/零件缺失自动检测(含UI界面与完整代码)
建议自行采集装配场景数据,标注缺失螺丝、错误零件等,模拟真实缺陷。手机/工业相机采集图像;使用LabelImg进行目标标注;转换为 YOLO 格式。本文构建了一个完整的装配完整性检测系统,基于 YOLOv10 实现高精度螺丝缺失检测,并使用 PyQt5 构建了图形界面,实现一键导入与可视化检测流程,适用于工业质检自动化部署。项目可灵活扩展至零件缺失、错装、错位、顺序错误等检测场景,是深度学习在制造业中落地的典型应用案例之一。
C++大数模板
分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法、减法、乘法、除法、n次方、取模、大小比较、赋值以及输入流、输出流的重载。。 并且使用这个大数模板,顺利AC了HDOJ上的1134这个题目的Catalan数计数问题。。http://acm.hdu.edu.cn/showproblem.php?pid=1134大数模板的代码如下:#inc...
华为OD机试真题 Java&Go 实现【优雅子数组】【100%通过率】【2022.11 Q4 新题】
如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组1,2,3,1、2,3,1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组1,2,3,1,2就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。
8-阿里云服务器 ECS配置R及Studio Server
步骤概览:(首先要明确自己的系统然后进行安装)
算法之大数相乘
1. 大数相乘问题 计算:999999999999999999999999999999 x 999999999999999999999999999999 = ?(30个9乘以30个9) 在JAVA语言中表示数字的类型有byte、short、int、long,这些类型都有其表示的数据范围,超过了能表示的范围就会产生数据溢出,比如: // 输出int能表示的最大数加1后的数 System.out.println(Integer.MAX_VALUE + 1); int能表示的最大数是2147483647,但
uniapp:实现圆盘/色盘取色器组件,圆环颜色选择器用户可拖拽选择颜色值实时更新用户选择的颜色数据,拖动丝滑流畅不卡顿(uniapp小程序/手机h5网页/安卓苹果app/nvue都能使用,详细源码)
uniapp项目中使用颜色选择器,uniapp实现简单圆形色盘、取色器、拾色器组件,Uniapp自定义颜色选择器取色器,圆形的颜色选择器,uniapp颜色拾取器,拾色器 取色器 颜色选择器,uniapp vue3圆形的色盘取色,uni-app如何封装一个取色器组件,用uniapp写调色板,uniapp颜色选择器插件,实现圆环颜色选择器,Uni-app在App端使用颜色选择器,uniapp微信小程序圆盘颜色选择,uniapp H5网页实现圆形的取色器,使用canvas实现的简单圆形色盘,可自定义相关大小,un
大数相加,大数相乘
大数相加 大数相加的核心思想就是对应位置的数相加后,再加上一次计算结果的进位,得到结果后,结果%10得到当前位置的数,结果/10得到进位,周而复始。 public static String add(String s1,String s2) { StringBuffer res = new StringBuffer(); s1 = new String...
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
Java实现大数相乘
大数相乘算法,可以避免因得数过大超过数据范围而显示错误的问题。 我所使用的大数相乘算法为逐位相乘处理进位法,主要运用了数组倒序和数组数组移动的方法。 大致原理为:如12345×678,先将12345和678倒序,然后相乘,每一位的结果为相乘后的结果加上上一位的进位: 得到结果后,将三个得数数组进行移动然后相加,这一步可以同步执行: 最后的结果逆序输出,即为答案。 代码实现: import java.util.Scanner; public class Multiplication { public
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
我的大数相乘
早就想写大数问题,一直拖到现在才把大数相乘给写了。我的思路:大数相乘建立在大数相加的基础上,类似二进制乘法,二进制直接移位相加,十进制先加后移位,再求和。 程序写地冗长,有时间再精减吧。 下一个写大数阶乘。 #include <stdio.h> #include <string.h> #define N 100 /***********************...
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
大数相乘 java_大数相乘——java版
之前面试的时候被问到两个很大很大的数相乘在java中怎么把它算出来,显然不能直接相乘,当时我只回答出来了用BigInteger,然而不是最好的答案。大数相乘的核心思想是将数字转化为字符串,然后逐位相乘转化最后才得出结果。先上一段代码:public static void main(String[] args) {String str1 = "23451515412151511212";String...
算法—大数相乘
大数相乘,顾名思义就是两个很大的数相乘,不能用系统自带的函数去处理,你怎么解决它?(比如:2322424*3156357) 这一题的思路是,就是按最原始的乘法,竖着的计算方法去进行处理。 如下图: 按照上面的思路,代码如下: def mul(a,b): a.reverse() #数据放到列表...
226



被折叠的 条评论
为什么被折叠?



