(本人知识 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!(n≤50)
思路:
为了减少循环次数以及数组的长度,这里使用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 }
运行结果:
原文地址:https://www.cnblogs.com/ChaseMeng/p/12668470.html
时间: 2024-10-27 12:04:14