[算法]高精度运算

(本人知识 while(1)cout<<"非常"; 有限,如果你看到我有任何错漏或者不足,真的真的真的恳请大家指出,蟹蟹,我希望大家可以一起进步~)

 一.摘要

int类型的变量只能存放-2^31~2^31-1范围的数据

long long类型的变量只能存放-2^63~2^63-1范围的数据

对于大数阶乘这种肯定是存不下,因此我们需要用数组存放数据;

二.高精度加法与高精度乘法(低精度*高精度)

  下面是一个高精度运算的例子:

题目描述

  用高精度计算出S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!++n!(n50)

思路:

  为了减少循环次数以及数组的长度,这里使用long long数组存放数据

代码(C++描述)

复制代码
1 /**[编程入门]阶乘求和*/ 2 #include<iostream> 3 #include<stdio.h> 4 #include<math.h> 5 using namespace std; 6 //存总和,初始化为0,每个long long存15位 7 long long data[10]={0}; 8 long long t[10]={1,0};//存i!,初始化为1,否则0的话永远为0 9 int len=10; //俩数组的长度 10 int n; 11 long long myMax=pow(10,15); 12 13 void myAdd(){//将i!加到data[] 14 int i,j; 15 int temp=0;//进位 16 for(i=0;i<len;i++){ 17 data[i]=data[i]+t[i]+temp; 18 temp=data[i]>=myMax?data[i]/myMax:0; 19 data[i]=data[i]%myMax; 20 } 21 } 22 void myMul(int m){//乘法 23 int i,j; 24 int temp=0;//进位 25 for(i=0;i<len;i++){ 26 t[i]=t[i]*m+temp; 27 temp=t[i]>=myMax?t[i]/myMax:0; 28 t[i]=t[i]%myMax; 29 } 30 } 31 void print(){//打印结果 32 int i,j,flag=0; 33 for(i=len-1;i>=0;i--){ 34 if(flag==1){ 35 printf("%015lld",data[i]);//之后的数格式化输出,输出15位 36 } 37 if(data[i]!=0&&flag==0){ 38 flag=1; 39 printf("%lld",data[i]);//第一个数不需要格式化输出 40 } 41 } 42 } 43 int main(){ 44 int i,j; 45 cin>>n; 46 for(i=1;i<=n;i++){ 47 myMul(i); //乘法 48 myAdd(); //加法 49 } 50 print();//打印结果 51 return 0; 52 }
复制代码

运行结果:


三.高精度乘法

四.高精度除法

posted @   小贼的自由  阅读(318)  评论(1编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示