大数相乘

Java 大数相乘 将大数相乘分成三步 1:定义 单个数 与 大数相乘 2:定义 两个大数相加 3:将单个数与大数相乘结果 用 定义好的 大数相加函数 加起来 import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args){ String num1 = "17543231453" 阅读详情
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;
    }

}


大数模板(C++)大数加法、大数乘法、大数除法 用C++写的重载的大数模板 大数加法、大数乘法、大数除法、大数减法 带有注释 立即下载

相关推荐

保姆级教程:用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信(附完整代码)

本文详细介绍了如何利用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信,涵盖硬件连接、寄存器配置、时序优化及FPGA接口设计等关键步骤。通过实例代码和调试技巧,帮助开发者快速掌握高效数据交互技术,提升嵌入式系统设计能力。

weixin_26918763的博客 226

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...

紫芝的博客 547

STM32F103C8T6+HX711实战:从零打造智能体重秤(附OLED显示与语音播报)

本文详细介绍了基于STM32F103C8T6微控制器和HX711称重模块,从零构建智能体重秤的完整实战教程。内容涵盖硬件选型、系统架构、驱动编写、数据滤波校准算法,并实现了OLED显示与语音播报功能。该项目是嵌入式学习的综合性实践,尤其适合作为毕业设计课题,帮助开发者掌握传感器应用、数据处理及人机交互等核心技能。

weixin_28285943的博客 516

高精度 大数加法 乘法 除法 幂 模板

高精度 大数加法 乘法 除法 幂 模板

3517

ENVI5.6+SARscape实战:基于哨兵一号的PS与SBAS时序InSAR地表形变监测全流程解析

本文详细解析了使用ENVI5.6和SARscape软件基于哨兵一号数据进行PS与SBAS时序InSAR地表形变监测的全流程。从数据获取、预处理到PS-InSAR和SBAS-InSAR处理,提供了实用技巧和优化建议,帮助用户高效完成地表形变监测任务。

weixin_29245767的博客 1151

2025年MathorCup数学应用挑战赛【B题完整论文】附参考代码(免费分享)

摘。

RS_handy的博客 2693

大数与小数模板(乘法,加法)

代码:#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';

cpfor 1253

装配完整性检查系统:基于YOLOv10的螺丝/零件缺失自动检测(含UI界面与完整代码)

建议自行采集装配场景数据,标注缺失螺丝、错误零件等,模拟真实缺陷。手机/工业相机采集图像;使用LabelImg进行目标标注;转换为 YOLO 格式。本文构建了一个完整的装配完整性检测系统,基于 YOLOv10 实现高精度螺丝缺失检测,并使用 PyQt5 构建了图形界面,实现一键导入与可视化检测流程,适用于工业质检自动化部署。项目可灵活扩展至零件缺失、错装、错位、顺序错误等检测场景,是深度学习在制造业中落地的典型应用案例之一。

YOLO 701

C++大数模板

分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法、减法、乘法、除法、n次方、取模、大小比较、赋值以及输入流、输出流的重载。。 并且使用这个大数模板,顺利AC了HDOJ上的1134这个题目的Catalan数计数问题。。http://acm.hdu.edu.cn/showproblem.php?pid=1134大数模板的代码如下:#inc...

ajwh64482的博客 443

华为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-优雅子数组。

MISAYAONE的博客 1万+

8-阿里云服务器 ECS配置R及Studio Server

步骤概览:(首先要明确自己的系统然后进行安装)

hx2024的博客 1570

算法之大数相乘

1. 大数相乘问题 计算:999999999999999999999999999999 x 999999999999999999999999999999 = ?(30个9乘以30个9) 在JAVA语言中表示数字的类型有byte、short、int、long,这些类型都有其表示的数据范围,超过了能表示的范围就会产生数据溢出,比如: // 输出int能表示的最大数加1后的数 System.out.println(Integer.MAX_VALUE + 1); int能表示的最大数是2147483647,但

天天向上 3341

uniapp:实现圆盘/色盘取色器组件,圆环颜色选择器用户可拖拽选择颜色值实时更新用户选择的颜色数据,拖动丝滑流畅不卡顿(uniapp小程序/手机h5网页/安卓苹果app/nvue都能使用,详细源码)

uniapp项目中使用颜色选择器,uniapp实现简单圆形色盘、取色器、拾色器组件,Uniapp自定义颜色选择器取色器,圆形的颜色选择器,uniapp颜色拾取器,拾色器 取色器 颜色选择器,uniapp vue3圆形的色盘取色,uni-app如何封装一个取色器组件,用uniapp写调色板,uniapp颜色选择器插件,实现圆环颜色选择器,Uni-app在App端使用颜色选择器,uniapp微信小程序圆盘颜色选择,uniapp H5网页实现圆形的取色器,使用canvas实现的简单圆形色盘,可自定义相关大小,un

✅ 精选推荐文章 4534

大数相加,大数相乘

大数相加 大数相加的核心思想就是对应位置的数相加后,再加上一次计算结果的进位,得到结果后,结果%10得到当前位置的数,结果/10得到进位,周而复始。 public static String add(String s1,String s2) { StringBuffer res = new StringBuffer(); s1 = new String...

Hollake的博客 626

怀旧版电脑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

Bare_Man的博客 3173

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

我的大数相乘

早就想写大数问题,一直拖到现在才把大数相乘给写了。我的思路:大数相乘建立在大数相加的基础上,类似二进制乘法,二进制直接移位相加,十进制先加后移位,再求和。 程序写地冗长,有时间再精减吧。 下一个写大数阶乘。 #include &lt;stdio.h&gt; #include &lt;string.h&gt; #define N 100 /***********************...

weixin_43794712的博客 240

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...

weixin_29822105的博客 786

算法—大数相乘

大数相乘,顾名思义就是两个很大的数相乘,不能用系统自带的函数去处理,你怎么解决它?(比如:2322424*3156357) 这一题的思路是,就是按最原始的乘法,竖着的计算方法去进行处理。 如下图: 按照上面的思路,代码如下: def mul(a,b): a.reverse() #数据放到列表...

weixin_43612049的博客 441
上一篇: 聚合体Aggregate
下一篇: 二叉树的非递归遍历
nodeathphoenix
博客等级 码龄16年 97粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值