[入门]高精度运算

Posted chasemeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[入门]高精度运算相关的知识,希望对你有一定的参考价值。

(本人知识 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数组存放数据

 

代码:

 
 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 }

 

运行结果:

技术图片

以上是关于[入门]高精度运算的主要内容,如果未能解决你的问题,请参考以下文章

高精度运算代码

Shell编程入门

GLSL-片段着色器不同部分的精度不同

大数高精度运算(模板)

从零开始的算法学习生活——①高精度运算

从零开始的算法学习生活——①高精度运算