码迷,mamicode.com
首页 > 其他好文 > 详细

[入门]高精度运算

时间:2020-04-09 17:59:23      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:cout   main   void   efault   精度   clu   代码   space   ace   

(本人知识 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 }

 

运行结果:

技术图片

[入门]高精度运算

标签:cout   main   void   efault   精度   clu   代码   space   ace   

原文地址:https://www.cnblogs.com/ChaseMeng/p/12668470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!