算法------大整数

2023-11-19

大整数

1.大整数加法

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<queue>
using namespace std;
#define max_n 1000
char str1[max_n], str2[max_n];
int num1[max_n], num2[max_n];



int main() {
    memset(str1, 0, sizeof(str1));
    memset(str2, 0, sizeof(str2));
    memset(num1, 0, sizeof(num2));
    memset(num2, 0, sizeof(num2));
    scanf("%s%s", str1, str2);
    int len1 , len2;
    len1 = strlen(str1);
    len2 = strlen(str2);
    int j = 0;
    int max = len1 > len2 ? len1 : len2;//取长度最大的赋值给max
    for (int i = len1 - 1 ;i >= 0 ;i--) 
    num1[j++] = str1[i] - '0';
  	//到过来存储
    j = 0;
    for (int i = len2 - 1 ;i >= 0 ;i--) 
    num2[j++] = str2[i] - '0';
  	//到过来存储
    for (int i = 0 ;i < max; i++) {//以最长的长度为基准
        num2[i] += num1[i];
        if (num2[i] >= 10) {
            num2[i] -= 10;
            num2[i + 1] += 1;
        }
    }
    if (num2[max]) printf("%d", num2[max]);
    for (int i = max - 1;i >= 0; i--) {
        printf("%d", num2[i]);
    }
    printf("\n");
    return 0;
}

代码解析

1.第一种要注意到的就是位数不想等的情况,所以我门要先对齐位数,再去模仿竖式

​ 就用 int max = len1 > len2 ? len1 : len2

2.做完之后将数字到着存在数组中,为了方便思考。

3.之后就是核心思想进位 10位进1, 向下一位进,这就是到这存储的原因

2.大整数减法

思想就是比大整数加法繁琐一点

最主要的一点就是大整数减法是要去借位,去向上一位借1位, 上一位减一位

#include <iostream>
#include <vector>
#include <iomanip>
#include <map>
#include <queue>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <algorithm>
using namespace std;

string str1, str2, str3;
int aa[1005], bb[1005], cc[1005], la, lb, lc;

int main(){
    cin >> str1 >> str2;
    la = str1.size();
    lb = str2.size();
    if(la < lb || ((la == lb) && (str1 < str2))){
        str3 = str2;
        str2 = str1;
        str1 = str3;
        cout << "-";
    }

    la = str1.size();
    lb = str2.size();
    for(int i = 0; i < la; i++){
        aa[i] = str1[la - i -1] - '0';
    }

    for(int i = 0; i < lb; i++){
        bb[i] = str2[lb - i -1] - '0';
    }
    int k = 0;
    for(int i = 0; i < la; i++){
        k = aa[i] - bb[i];
        if(k < 0){
            k += 10;
            aa[i + 1] -= 1;
        }
        cc[i] = k;
    }

    while(cc[la] == 0) la--;
    for(int i = la; i >= 0 ; i--){
        cout << cc[i];
    }
    cout << endl;
    return 0;
}

3.大整数乘法

image-20200913153519868

模拟竖式,将乘的结果放在数组中,最后处理一下今进位的问题

image-20200913153832280

数组的0位是长度,倒着存储。

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <map>
#include <stack>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
char num1[105], num2[105];
int num3[105], num4[105], ans[305];
//用数组的0位去存长度可以节省i部分的空间
int main() {
    cin >> num1 >> num2;
    for (int i = strlen(num1) - 1, j = 1; i >= 0; i--, j++) {
        num3[j] = num1[i] - '0';
    }
    for (int i = strlen(num2) - 1, j = 1; i >= 0; i--, j++) {
        num4[j] = num2[i] - '0';
    }
    num3[0] = strlen(num1);
    num4[0] = strlen(num2);
    for (int i = 1; i <= num3[0]; i++) {
        for (int j = 1; j <= num4[0]; j++) {
            ans[i + j - 1] += num3[i] * num4[j];
        }
    }
  //核心思想
    for (int i = 1; i <= num3[0] + num4[0]; i++) {
        if (ans[i] >= 10) {
            ans[i + 1] += ans[i] / 10;
            ans[i] %= 10;
        }
        if (ans[i] != 0) {
            ans[0] = i;
        }
    }
    for (int i = ans[0]; i > 0; i--) {
        cout << ans[i];
    }
    cout << endl;
    return 0;
}

4.大整数除法

1.模拟竖式,每次判断当前缓存是否大于除数

2.若大于则减去一次除数,答案加一 并继续判断

3.若不是则将除数的下一位加入缓存 同时答案进一位 并继续判断

4.直到被除数全部加入缓存 且缓存不大于除数

5.此时答案即为商 缓存即为余数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法------大整数 的相关文章

  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • `cosf`、`sinf` 等不在 `std` 中 [重复]

    这个问题在这里已经有答案了 根据这里的讨论 我有报告了一个错误 https bugs launchpad net ubuntu source gcc 8 bug 1831385给 Ubuntu 开发者 编译以下示例 C 程序时 includ
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • asp.net c# 防止在从服务器端代码更改索引时触发 selectedindexchanged 事件

    我在同一个 aspx 页面上有两个下拉列表控件
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐

  • cpu的出错概率?

    我今天想到了一个很不懂的问题 cpu执行指令会出错吗 出错的概率是多少 为什么服务器能够不间断的工作很长时间呢 难道cpu指令级的东西不会出错 操作系统怎么避免这些错误呢 2012 5 27 找到一篇文章 http wuyudong blo
  • MATLAB实现五种边缘检测

    一 原理 常用的边缘检测算法有拉普拉斯边缘检测算法 Robert边缘检测算子 Sobel边缘检测算子 Prewitt边缘检测算子 Canny边缘检测算子 二 代码 filename pathname uigetfile jpg bmp gi
  • 一些办公技巧的分享

    分享一 借助微信聊天转换图片的格式 如果你只想要将照片转换成同一种格式 我们可以借助微信的聊天界面 它可以将图片转换成JPG格式 具体操作步骤如下 打开微信的任意聊天对话框 发送图片 然后按下鼠标右键 多选照片 点击 保存 确定 即可 分享
  • git 生成补丁文件及打补丁

    一 patch 和diff 的区别 Git 提供了两种补丁方案 一是用git diff生成的UNIX标准补丁 diff文件 二是git format patch生成的Git专用 patch 文件 diff文件只是记录文件改变的内容 不带有c
  • R语言函数之——ifelse

    ifelse 向量化的函数 在向量赋值的时候 特别有用 如下面例子 gt x lt 1 10 gt y lt ifelse x gt 5 0 10 gt y 1 10 10 10 10 10 0 0 0 0 0 把向量中的NA换为0 gt
  • Spring 新版本修复远程命令执行漏洞(CVE-2022-22965),墨菲安全开源工具可应急排查

    漏洞简述 3月31日 spring 官方通报了 Spring 相关框架存在远程代码执行漏洞 并在 5 3 18 和 5 2 20 RELEASE 中修复了该漏洞 漏洞评级 严重 影响组件 org springframework spring
  • 测试IP和端口是否被封锁

    操作 将自己IP和端口分别输入以下两个网站的测试栏中 国内测试 http tool chinaz com port 国外测试 https www yougetsignal com tools open ports 判断 如果国内的显示关闭
  • UnityUI炸出金币再收集的特效

    完成的效果 在指定位置生成一定数量的货币ICON 然后扩散出去 等待一定时间后 汇集到指定位置 代码 using System Collections using System Collections Generic using Unity
  • SQL笛卡尔积(×)、连接(∞)、投影(π)、选择(σ)关系符号

    笛卡尔积 连接 投影 选择 由 R 中的每一个元组与 S 中的每一个元组两两相连 把R和S的元组以所有可能的方式组合起来 合并为 R S 的元组 形式化定义如下 笛卡尔积 笛卡尔积 与连接 连接运算是从两个关系的广义笛卡尔积中选取属性间满足
  • 《大型网站技术架构设计》第二篇 架构-性能

    不同视角下的网站性能 1 用户 从用户角度 网站性能就是用户在浏览器上直观感受到的网站响应速度快还是慢 用户感受到的时间 2 开发人员 开发人员关注的主要是应用程序本身及其相关子系统的性能 包括响应延迟 系统吞吐量 并发处理能力 系统稳定性
  • openwrt软路由重置firstboot重启reboot关机poweroff

    重置 恢复出厂设置 先执行firstboot命令 再执行reboot命令 过了几秒钟才会响应 重启设备 执行reboot命令 设备关机 执行poweroff命令
  • 林木的第一篇博客——A New Beginning

    大家好 我是一名就读于TAYLOR S UNIVERSITY 的学生 大学主专业是计算机科学 很高兴认识大家 从今天开始我将开始学习C语言 以及跟计算机有关的一切 并在每周天把心得和知识分享出来 和大家一起学习进步 很荣幸跟大家一起学习 1
  • “千年虫”,计算机的巨大BUG!

    作者 十三侃娱乐 说起来 现在社会科技中 除了真正学过计算机专业的人 大部分人对于 千年虫 这个称号都有些陌生 甚至有些人连听都没听过 不知道的网友听到 虫 这个字可能还会脑补出一大堆不明生物的样子 但其实 千年虫 并不是一种生物 而是一种
  • LitCTF部分题目WP(Virginia,ping,SQL)

    目录 校外 Virginia ping 这是什么 SQL 注一下 校外 Virginia 维吉尼亚 想到维吉尼亚解码但没有key就爆破key Vigenere Solver guballa de key flag 发现解码出来的还有一部分是
  • 六边形地图生成(1)——基础地形

    看了大佬的六边形地图教程 跟着原教程敲了一遍代码 使用的引擎是unity 想把六边形地形的生成思路记录下来 1 基础六边形网格 基础网格很容易绘制 六个边缘点 一个中心点 如何在引擎中绘制动态网格网上一搜一大把 这里就不介绍了 2 边缘扰动
  • maya中adv插件绑定1

    一 导入模型 复制ctrl D 添加名称前缀 创建混合变形 平行选项 二 摆放adv骨骼 最好模型单独创建一个层 导入adv骨骼 1 对齐骨骼 腿部 最好是在正交视图下操作 2 对齐手臂部分 对齐到手腕即可 手指不用对 3 对齐头部 小技巧
  • Qt 实现鼠标拖动控件

    在QT项目中 窗口设置 setWindowFlags Qt FramelessWindowHint 之后 就无法拖动 所以会自定义一个menubar控件 并实现窗口拖动 效果如上图 上代码 include
  • 经典C语言程序之 C/C++:计算两个整数的和

    经典C语言程序之 C C 计算两个整数的和 在C C 编程中 计算两个整数的和是一个经典的问题 本文将介绍如何使用C语言编写一个简单的程序来实现这一功能 首先 我们需要定义两个整数变量来存储用户输入的值 并用scanf函数从用户处获取这些值
  • VSCode如何设置终端工作目录

    文章目录 前言 固定工作目录 Terminal Here 注意 前言 相信大家在使用VSCode的时候 都会有如下难受的感觉 每次打开终端的时候工作目录都是用户目录 如果要执行命令还得cd到当前文件夹 十分麻烦 为了提高工作效率 有必要设置
  • 算法------大整数

    大整数 1 大整数加法 include