当前位置: 首页 > news >正文

高精度算法(加、减、乘、除、阶乘和)​

 归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
唯有主动付出,才有丰富的果实获得收获!

高精度乘法

#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+100; // 定义一个较大的数组大小,用于存储大整数string s1,s2; // 用于输入两个字符串形式的大整数
int a[N],b[N],c[N],ans,ma; // a 和 b 存储两个大整数的每一位数字,c 存储结果,ans 用于进位,ma 记录较大数的位数int main()
{cin>>s1>>s2; // 输入两个大整数(以字符串形式)int j=1,k=1;// 将字符串 s1 的每一位数字从低位到高位存入数组 afor(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';// 将字符串 s2 的每一位数字从低位到高位存入数组 bfor(int i=s2.size()-1;i>=0;i--) b[k++]=s2[i]-'0';// 获取两个大整数的最大长度ma=max(s1.size(),s2.size());// 模拟竖式加法,逐位相加并处理进位for(int i=1;i<=ma;i++){ans+=a[i]+b[i]; // 当前位相加,并加上上一位的进位c[i]=ans%10; // 当前位的结果是相加后的个位数ans/=10; // 更新进位值}// 如果最高位仍有进位,则需要额外增加一位if(ans) c[++ma]=ans;// 从高位到低位输出结果for(int i=ma;i>=1;i--)cout<<c[i];return 0;
}

高精度减法

#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+100; // 定义一个较大的数组大小,用于存储大整数string s1,s2; // 用于输入两个字符串形式的大整数
int a[N],b[N],c[N],ma; // a 和 b 存储两个大整数的每一位数字,c 存储结果,ma 记录较大数的位数int main()
{cin>>s1>>s2; // 输入两个大整数(以字符串形式)// 如果 s1 小于 s2,则交换两者,并输出负号表示结果为负数if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2)){cout<<'-'; // 输出负号swap(s1,s2); // 交换 s1 和 s2 的值,确保 s1 始终是较大的数}int j=1,k=1;// 将字符串 s1 的每一位数字从低位到高位存入数组 afor(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';// 将字符串 s2 的每一位数字从低位到高位存入数组 bfor(int i=s2.size()-1;i>=0;i--) b[k++]=s2[i]-'0';// 获取两个大整数的最大长度ma=max(s1.size(),s2.size());// 模拟竖式减法,逐位相减并处理借位for(int i=1;i<=ma;i++){if(a[i]-b[i]<0) // 如果当前位不够减{a[i]+=10; // 向高位借 10a[i+1]-=1; // 高位减 1}c[i]=a[i]-b[i]; // 当前位的结果是相减后的值}// 去掉结果中的前导零while(c[ma]==0&&ma>1) ma--;// 从高位到低位输出结果for(int i=ma;i>=1;i--)cout<<c[i];return 0;
}

高精度乘法

#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+100; // 定义一个较大的数组大小,用于存储大整数string s1,s2; // 用于输入两个字符串形式的大整数
int a[N],b[N],s[N],c[N],ans,ma; // a 和 b 存储两个大整数的每一位数字,s 存储中间结果,c 存储最终结果,ans 用于进位,ma 记录结果的最大可能位数int main()
{	cin>>s1>>s2; // 输入两个大整数(以字符串形式)int j=1,k=1;// 将字符串 s1 的每一位数字从低位到高位存入数组 afor(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';// 将字符串 s2 的每一位数字从低位到高位存入数组 bfor(int i=s2.size()-1;i>=0;i--) b[k++]=s2[i]-'0';// 计算结果的最大可能位数ma=s1.size()+s2.size()-1; // 两个数相乘的结果最多有 s1.size() + s2.size() - 1 位// 模拟竖式乘法,逐位相乘并累加到中间结果数组 s 中for(int i=1;i<=s1.size();i++){for(int j=1;j<=s2.size();j++){s[i+j-1]+=a[i]*b[j]; // 将第 i 位和第 j 位相乘的结果累加到对应的位置}}// 处理进位,将中间结果数组 s 转换为最终结果数组 cfor(int i=1;i<=ma;i++){ans+=s[i]; // 累加当前位的值和之前的进位c[i]=ans%10; // 当前位的结果是累加值的个位数ans/=10; // 更新进位值}// 如果最高位仍有进位,则需要额外增加一位if(ans) c[++ma]=ans;// 去掉结果中的前导零while(c[ma]==0&&ma>1) ma--;// 从高位到低位输出结果for(int i=ma;i>=1;i--)cout<<c[i];return 0;
}

高精度除法

#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+10; // 定义一个较大的数组大小,用于存储大整数string s1; // 用于输入字符串形式的大整数
int a[N],b,c[N],ans,ma; // a 存储大整数的每一位数字,b 是除数,c 存储结果,ans 用于存储当前余数,ma 记录大整数的位数int main()
{cin>>s1>>b; // 输入大整数(以字符串形式)和除数 bint j=1;// 将字符串 s1 的每一位数字从低位到高位存入数组 afor(int i=s1.size()-1;i>=0;i--) a[j++]=s1[i]-'0';ma=s1.size(); // 获取大整数的位数// 模拟竖式除法,逐位计算商和余数for(int i=ma;i>=1;i--){ans=ans*10+a[i]; // 当前余数乘以 10 加上当前位的数字c[i]=ans/b; // 当前位的商是当前余数除以除数 b 的结果ans%=b; // 更新余数为当前余数对除数 b 取模的结果}// 去掉结果中的前导零while(c[ma]==0&&ma>1) ma--;// 从高位到低位输出结果for(int i=ma;i>=1;i--)cout<<c[i];return 0;
}

高精度阶乘和

#include<bits/stdc++.h>
using namespace std;
#define debug(a) cout<<a<<" "const int N=1e5+10; // 定义一个较大的数组大小,用于存储大整数int n,a[N],b[N],ans,ma,mb; // a 存储当前阶乘的结果,b 存储前 n 个阶乘的和,ans 用于进位,ma 和 mb 分别记录当前阶乘和总和的最大位数int main()
{cin>>n; // 输入 n,表示求前 n 个阶乘的和for(int k=1;k<=n;k++) // 外层循环:求前 n 个阶乘的和{a[1]=1; ma=1; // 初始化当前阶乘为 1(即 1 的阶乘),并设置最大位数为 1for(int i=1;i<=k;i++) // 内层循环:计算 k 的阶乘{ans=0; // 初始化进位值为 0// 高精度乘法:将当前阶乘结果 a 乘以 ifor(int j=1;j<=ma;j++){ans+=a[j]*i; // 当前位乘以 i 并加上之前的进位a[j]=ans%10; // 当前位的结果是累加值的个位数ans/=10; // 更新进位值}// 如果最高位仍有进位,则需要扩展位数while(ans){a[++ma]=ans%10; // 将进位值添加到新的高位ans/=10; // 继续处理进位}}// 更新总和的最大位数mb=max(ma,mb); ans=0;// 高精度加法:将当前阶乘结果 a 加到总和 b 中for(int i=1;i<=mb;i++){ans+=a[i]+b[i]; // 累加当前位和之前的进位b[i]=ans%10; // 当前位的结果是累加值的个位数ans/=10; // 更新进位值}// 如果最高位仍有进位,则需要扩展位数if(ans) b[++mb]=ans;}	// 从高位到低位输出结果for(int i=mb;i>=1;i--)cout<<b[i];	return 0;
}

http://www.xdnf.cn/news/32653.html

相关文章:

  • QML Rectangle 组件
  • 直线轴承常规分类知多少?
  • 洛谷P1177【模板】排序:十种排序算法全解(1)
  • Keil A51汇编伪指令
  • 【机器学习】朴素贝叶斯算法:原理剖析与实战应用
  • Java学习手册:Web 应用架构概述
  • 卷积神经网络(CNN)详解
  • 【嵌入式】——Linux系统远程操作和程序编译
  • 前端面试真题集合(一)
  • Python语法系列博客 · 第9期[特殊字符] 函数参数进阶:*args、**kwargs 与参数解包技巧
  • 树莓派5-开发应用笔记
  • Java Web 之 Tomcat 100问
  • git合并分支并推送
  • 为什么浮点数会搞出Infinity和NAN两种类型?浮点数的底层原理?IEEE 754标准揭秘?
  • matlab 环形单层柱状图
  • 解锁异步JavaScript性能:从事件循环(Event Loop)到Promise与Async/Await的最佳实践
  • 电商平台计算订单成交额是不是要去除退款退货的
  • CMFA在自动驾驶中的应用案例
  • 多线程使用——线程安全、线程同步
  • 【Canvas与旗帜】标准英国米字旗
  • 实现批量图片文字识别(python+flask+EasyOCR)
  • 系统架构设计师:计算机组成与体系结构(如CPU、存储系统、I/O系统)案例分析与简答题、详细解析与评分要点
  • 【C++动态规划】2801. 统计范围内的步进数字数目|2367
  • 洛谷P1177【模板】排序:十种排序算法全解(2)
  • Docker安装与介绍(一)
  • 【工具变量】A股上市公司信息披露质量KV指数测算数据集(含do代码 1991-2024年)
  • 青少年编程与数学 02-016 Python数据结构与算法 29课题、自然语言处理算法
  • 黑马Java基础笔记-1
  • 计算机网络——常见的网络攻击手段
  • 面试题之如何设计一个秒杀系统?