高精度模板

加法

P1601 A+B Problem(高精)

#include<iostream>using namespace std;
const int N = 1e6 + 10; 
int a[N],b[N],c[N];
int len1,len2,lenMax; //长度要提前定义在全局,在函数中要使用 void add(int c[],int a[],int b[])
{for(int i=0;i<lenMax;i++){c[i] += a[i] + b[i]; //这里一定是+= ,因为要加上 上一位 给的进位值 c[i + 1] = c[i] / 10; //先处理进位,给下一个位置c[i] %= 10; //再取模存入c[i] }//处理整体进位后结果长度要+1if(c[lenMax]) lenMax++; 
}int main()
{string s1,s2;cin >> s1 >> s2;len1 = s1.length(), len2 = s2.length();lenMax = max(len1,len2);for(int i=0;i<len1;i++) a[i] = s1[len1-1-i] - '0';for(int i=0;i<len2;i++) b[i] = s2[len2-1-i] - '0';add(c,a,b); //a数组、b数组相加的结果放在c数组 for(int i=lenMax-1;i>=0;i--) cout << c[i]; return 0;
}

减法

P2142 高精度减法

#include<iostream>using namespace std;
const int N = 1e6 + 10; 
int a[N],b[N],c[N];
int la,lb,lc;bool cmp(string& x,string& y) //如果第一个参数小就返回true 
{if(x.size() != y.size()){return x.size() < y.size();}else{return x < y;}
}void sub(int c[],int a[],int b[])
{for(int i=0;i<lc;i++){c[i] += a[i] - b[i];if(c[i] < 0){c[i + 1] -= 1; //c[i+1] = -1;c[i] += 10;}}while(lc > 1 && c[lc-1] == 0 ) lc--; //lc最多减到1
}int main()
{string x,y;cin >> x >> y;if(cmp(x,y))  {swap(x,y); //确保x比y大,因为等会要用大数减小数cout << "-"; //交换了说明题目给的是大数减小数,结果为负数 }la = x.length(); lb = y.length(); lc = max(la,lb);//转化成数组形式 注意减去字符'0' for(int i=0;i<la;i++) a[i] = x[la-1-i] - '0';for(int i=0;i<lb;i++) b[i] = y[lb-1-i] - '0';//执行减法 sub(c,a,b); //输出c数组结果for(int i=lc-1;i>=0;i--) cout << c[i]; return 0;
} 

注意:在消除前导0的时候 while(lc > 1 && c[lc-1] == 0 ) lc--; 该语句中的while不能改为if,虽然我们知道减法顶多会让较大的那个数字减少一位,所以可能就想这条语句顶多执行一次,但是如果这被减数和减数相等,那么减完的结果全部是0,这个时候必须要用while循环去除所有的0

乘法

P1303 A*B Problem

#include <iostream>
using namespace std;const int N = 1e6 + 10;
int a[N],b[N],c[N];
int la,lb,lc;void mul(int c[],int a[],int b[])
{//两层循环模拟列竖式相乘的过程 i和j位置的数相乘结果存在c数组的i+j位置for(int i=0;i<la;i++){for(int j=0;j<lb;j++){c[i+j] += a[i] * b[j]; //无进位乘法,最后处理进位	} }//处理进位 for(int i=0;i<lc;i++){c[i+1] += c[i] / 10; c[i] %= 10;}//处理前导零while(lc > 1 && c[lc-1] == 0) lc--; 
}int main() 
{string x,y;cin >> x >> y;la = x.size(); lb = y.size(); lc = la + lb; //相乘的结果的最大长度是两个因数的长度和 for(int i=0;i<la;i++) a[i] = x[la-1-i] - '0';for(int i=0;i<lb;i++) b[i] = y[lb-1-i] - '0';mul(c,a,b);for(int i=lc-1;i>=0;i--) cout << c[i];	return 0;
}

除法

P1480 A/B Problem

#include<iostream>
using namespace std;const int N = 1e6 + 10;int a[N],b,c[N];
int la,lc;typedef long long LL; //t有可能超intvoid div(int c[],int a[],int b)
{LL t = 0; //用来存每一位除完的余数for(int i = la - 1;i >= 0;i--) //从最高位开始处理,所以从la-1开始遍历{t = t * 10 + a[i];c[i] = t / b;t %= b; }while(lc > 1 && c[lc - 1] == 0) lc--; 
}int main()
{string x;cin >> x >> b;la = x.size(); lc = la; //结果和被除数的长度是相同的,只不过结果可能出现前导0,最后处理for(int i = 0;i < la;i++) a[i] = x[la - i - 1] - '0';div(c,a,b);for(int i = lc - 1;i >= 0;i--) cout << c[i];return 0;
}

Q:为什么a要从高位开始处理还要倒着存?
A:方便记忆模板,四种高精度都是倒着存,而且方便处理前导0,处理的方式与其他的高精度都一样。但是正着存就要从数组的左边开始处理前导0,而且输出结果的时候还需要确定范围。

这是a正着存的模版:

#include<iostream>
using namespace std;const int N = 1e6 + 10;int a[N], b, c[N];
int la, lc;typedef long long LL; void div(int c[], int a[], int b)
{LL t = 0; // 用来存每一位除完的余数for(int i = 0; i < la; i++)  // 这里应该是i++,不是i--{t = t * 10 + a[i];c[i] = t / b;t %= b; }// 处理前导零int k = 0;while(k < la && c[k] == 0) k++;  // 找到第一个非零位lc = la - k;// 将结果前移for(int i = 0; i < lc; i++)c[i] = c[i + k];
}int main()
{string x;cin >> x >> b;la = x.size();for(int i = 0; i < la; i++) a[i] = x[i] - '0';div(c, a, b);// 输出结果for(int i = 0; i < lc; i++) cout << c[i];if(lc == 0) cout << "0";  // 处理结果为0的情况return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/87116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

monorepo使用指北

|  WARN  node_modules is present. Lockfile only installation will make it out-of-date  ERR_PNPM_FETCH_404  GET https://registry.npmjs.org/common%2Fcommon: Not Found - 404 This error happened while installing a direct dependency of G:\monorepo\vue3 comm…

Java八股文——Spring「MyBatis篇」

与传统的JDBC相比&#xff0c;MyBatis的优点&#xff1f; 面试官您好&#xff0c;MyBatis相比于传统的JDBC&#xff0c;它并不是要完全颠覆JDBC&#xff0c;而是作为JDBC的一个强大的“增强框架”。它的核心价值在于&#xff0c;在保留了SQL最大灵活性的前提下&#xff0c;极大…

JavaScript基础-常用的鼠标事件

一、前言 在前端开发中&#xff0c;鼠标事件 是实现用户交互的重要手段之一。通过监听用户的点击、移动、悬停等操作&#xff0c;我们可以构建出丰富而灵活的网页交互体验。 本文将带你深入了解&#xff1a; JavaScript 中常见的鼠标事件&#xff1b;各类鼠标事件的触发时机…

windows录频软件

一.很反感有些做软件的&#xff0c;把别人开源的改个界面收费&#xff0c;所以我找了一个开源免费的。 二.准备工具 一台电脑&#xff0c; Captura:完全开源免费的录频软件。 ffmpeg&#xff1a;音频格式转换软件&#xff0c;这可是非常大名鼎鼎的工具。 三.安装Captura 网址…

python中的模块化编程:日期模块、math算术模块、random模块

内置模块&#xff08;math、random、时间&#xff09;自定义模块&#xff08;自己写的部分代码&#xff09;第三方模块&#xff08;引入的第三方代码库的模块&#xff09; math模块 import math#圆周率 print(math.pi) #自然常数 print(math.e) #圆周率的二倍 print(math.tau…

【学习笔记】Langchain基础(二)

前文&#xff1a;【学习笔记】Langchain基础 文章目录 8 [LangGraph] 实现 Building Effective Agents&#xff0c;各种 workflows 及 AgentAugmented LLMPrompt ChainingParallelizationRoutingOrchestrator-Worker (协调器-工作器)Evaluator-optimizer (Actor-Critic)Agent 8…

Java大模型开发入门 (9/15):连接外部世界(中) - 向量嵌入与向量数据库

前言 在上一篇文章中&#xff0c;我们成功地将一篇长文档加载并分割成了一系列小的文本片段&#xff08;TextSegment&#xff09;。我们现在有了一堆“知识碎片”&#xff0c;但面临一个新问题&#xff1a;计算机如何理解这些碎片的内容&#xff0c;并找出与用户问题最相关的片…

Windows下MySQL安装全流程图文教程及客户端使用指南(付整合安装包)

本教程是基于5.7版本安装&#xff0c;5.7和8.0的安装过程大差不差 安装包「windows上mysql中安装包资源」 链接&#xff1a;https://pan.quark.cn/s/de275899936d 一、安装前的准备 1.1 获取 MySQL 安装程序 官网 前往 MySQL 官方下载页面&#xff0c;下载适用于 Windows 系…

笔记 软件工程复习

第一章 软件工程学概述 1.1 软件危机&#xff08;Software Crisis&#xff09; 概念 定义&#xff1a;软件危机指在计算机软件开发与维护过程中遇到的一系列严重问题&#xff0c;源于1960年代软件复杂度激增与传统开发方法失效的矛盾。 本质&#xff1a;软件规模扩大 → 开…

GaussDB创建数据库存储

示例一&#xff1a; 下面是一个简单的GaussDB存储过程示例&#xff1a; –创建一个存储过程。 CREATE OR REPLACE PROCEDURE prc_add (param1 IN INTEGER,param2 IN OUT INTEGER ) AS BEGINparam2: param1 param2;dbe_output.print_line(result is: ||to_char(param…

基于51单片机的校园打铃及灯控制系统

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能&#xff1a; &#xff08;1&#xff09;实时显示当前时间&#xff08;年月日时分秒星期&#xff09;&#xff0c;LED模式指示灯亮。 &#xff08;2&#xff09;按下“打铃”和“打铃-”按键…

PHP+mysql雪里开轻量级报修系统 V1.0Beta

# PHP雪里开轻量级报修系统 V1.0Beta ## 简介 这是一个基于PHP7和MySQL5.6的简易报修系统&#xff0c;适用于学校、企业等机构的设备报修管理。 系统支持学生提交报修、后勤处理报修以及系统管理员管理用户和报修记录。 初代版本V1.0&#xff0c;尚未实际业务验证&#xff0c;…

XCTF-misc-base64÷4

拿到一串字符串 666C61677B45333342374644384133423834314341393639394544444241323442363041417D转换为字符串得到flag

Mini DeepSeek-v3训练脚本学习

Mini DeepSeek-v3 训练脚本详细技术说明(脚本在文章最后) &#x1f4cb; 概述 这是一个实现了Mini DeepSeek-v3大语言模型的训练脚本&#xff0c;集成了多项先进的深度学习技术。该脚本支持自动GPU选择和分布式训练&#xff0c;适合在多GPU环境下训练Transformer模型。 &…

FPGA 的硬件结构

FPGA 的基本结构分为5 部分&#xff1a;可编程逻辑块&#xff08;CLB&#xff09;、输入/输出块&#xff08;IOB&#xff09;、逻辑块之间的布线资源、内嵌RAM 和内嵌的功能单元。 &#xff08;1&#xff09;可编程逻辑块&#xff08;CLB&#xff09; 一个基本的可编程逻辑块由…

算法专题八: 链表

1.两数相加 题目链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode…

5G+边缘计算推动下的商品详情API低延迟高效率新方案

在电商行业&#xff0c;商品详情API的性能直接关系到用户体验与平台竞争力。传统云计算模式在处理高并发请求时&#xff0c;常面临网络延迟高、带宽成本大等问题。而5G与边缘计算的结合&#xff0c;为商品详情API的低延迟高效率提供了新方案。本文将深入探讨这一新方案&#xf…

【Python教程】CentOS系统下Miniconda3安装与Python项目后台运行全攻略

一、引言 为了在CentOS系统上高效地开发和运行Python项目&#xff0c;我们常常需要借助Miniconda3来管理Python环境。本文将详细介绍如何在CentOS系统上安装Miniconda3&#xff0c;并将Python项目部署到后台运行。 二、Miniconda3和CentOS系统介绍 Miniconda3介绍 Minicond…

【读点论文】A Survey on Open-Set Image Recognition

A Survey on Open-Set Image Recognition Abstract 开集图像识别(Open-set image recognition&#xff0c;OSR)旨在对测试集中已知类别的样本进行分类&#xff0c;并识别未知类别的样本&#xff0c;在许多实际应用中支持鲁棒的分类器&#xff0c;如自动驾驶、医疗诊断、安全监…

使用DuckDB查询DeepSeek历史对话

DeepSeek网页版在左下角个人信息/系统设置的账号管理页签中有个“导出所有历史对话”功能&#xff0c;点击“导出”&#xff0c;片刻就能生成一个deepseek_data-2025-06-14.zip的文件&#xff0c;里面有2个json文件&#xff0c;直接用文本编辑器查看不太方便。 而用DuckDB查询却…