目录

前言

一、阶乘和是什么?

二、题目

三、对错代码对比

1.错误代码

2.正确代码

四,拓展(以下均多组输入)

1,简单阶乘(int递归)

2,阶乘改进1(long long递归)

3,阶乘改进2(高精度阶乘,数组进位)


前言

我在蓝桥杯oj刷题网,遇到了一道通过率7%的题目,求阶乘之和并取余998244353,第一个问题是时间超限,用了近3秒,网上找了很多答案也都超限了,然后自己写了个简单的还超限。

一、阶乘和是什么?

阶乘 n! = 1*2*3*...*n,阶乘和 1! + 2! + ... + n!

二、题目

1040: 阶乘之和
内存限制:256 MB
时间限制:1 S

提交:811
通过:65

题目描述
求1!+2!+3!+...+n!,由于答案很大,答案对998244353求余即可。

输入存在多组测试数据,对于每组测试数据输入一个正整数n(1<=n<=10^6)

对于每组测试数据输出一行表示答案

输入
1
5
输出
1
153

三、对错代码对比

1.错误代码

代码如下(示例):

#include<iostream>
using namespace std;
#define M 998244353
int main()
{int n;while(cin>>n){long long a = 1, s = 0;//a, s <= M与等于10^9for(int i = 1; i <= n; i++)//i <= 10^6{a = (a * i) % M;//a = 1,2,6,24...s = (s + a) % M;//s = 1,3,9,33...}cout<<s<<endl;}return 0;
}

分析:

上面代码可以算到10^6,结果也正确,但由于程序不断输入,所以之前算过的,后面还得一直重复,就会超时(2918ms),这时就需要一个数组将数据保存起来,后面需要直接调用

2.正确代码

#include<iostream>
using namespace std;#define M 998244353
#define N 1000010int s[N];//定义为全局变量,数组的内容才自动初始化为0,//这里不建议定义为局部,因为大数组容易栈空间不够导致无法输入输出
int main()
{int n;long long a = 1;//1,这里不用int,后续乘法会溢出 2,记得给a赋初值for(int i = 1; i < N; i++){a = a*i % M;s[i] = (s[i-1] + a) % M;}//因为程序是不断输入的,数组保留下算过的答案,后面直接调用就行while(cin>>n)cout<<s[n]<<endl;return 0;
}

分析:

1,大数组最好定义为全局变量,阶乘改进2有解释

2,上面代码用了84ms

四,拓展(以下均多组输入)

1,简单阶乘(int递归)

请看代码:

#include<iostream>
using namespace std;int fac(int x)//递归函数
{int s;if(x == 0 || x == 1)s = 1;elses = x * fac(x-1);return s;
}int main()
{int a;int b = 0;while(cin>>a)cout<<a<<"!= "<<fac(a)<<endl;return 0;
}

分析:这样最多只能算12的阶乘,12!= 479001600

2,阶乘改进1(long long递归)

#include<iostream>
using namespace std;long long fac(int x)//递归函数
{long long s;if(x == 0 || x == 1)s = 1;elses = x * fac(x-1);return s;
}int main()
{int a;long long b = 0;while(cin>>a)cout<<a<<"!= "<<fac(a)<<endl;return 0;
}

分析:定义函数时改为long long可以算到20,20! = 2432902008176640000

3,阶乘改进2(高精度阶乘,数组进位)

#include<iostream>
#include<string.h>//memset()
using namespace std;
int a[100010];
int main(){//c为进位数int n,c=0,sum;cin>>n;memset(a,0,sizeof(a));//把a中所有字节换做数字0,可对数组初始化a[0] = 1;//初始值为1for(int i = 2;i<=n;i++){for(int j = 0;j<10000;j++ ){sum = a[j]*i+c;a[j]=sum%10;//存储个位数字到a[j]c = sum/10;//获取进位数,比如12*9,其中2*9=18,需进位1,保存到c变量中。}}for(int i = 10000;i>=0;i--){
//      当最后一个不为零时,倒叙输出完即可breakif(a[i]!=0){for(int j = i;j>=0;j--){cout<<a[j];}break;}}return 0;
}

分析:

1,当我们需要定义一个极大的数组时,最好在main函数外部定义 ,否则容易栈溢出,详情看:

(12条消息) 003 大数组为什么要定义在主函数外?在主函数内为什么不可以?_小曾爱吃榴莲的博客-CSDN博客_数组定义在主函数外

2,试了下,输入100000,等了10秒才出结果,大概是10^10000那么大的数

C++求阶乘四种方法,阶乘和,高精度阶乘相关推荐

  1. 剑指offer——面试题9:求斐波那切数列的四种方法

    剑指offer--面试题9:求斐波那切数列的四种方法 另一个相关的链接:https://blog.csdn.net/Allenlzcoder/article/details/80297333 总结下求 ...

  2. C语言四种方法求最大公约数

    一.实验要求 运行最大公约数的常用算法,并进行程序的调试与测试,要求程序设计风格良好,并添加异常处理模块. 二.实验方法(四种) 1.辗转相除法(欧几里德法) C语言中用于计算两个正整数a,b的最大公 ...

  3. python求两个数的最大公约数穷举法_C++求最大公约数四种方法解析

    C++求最大公约数的四种方法思路,供大家参考,具体内容如下 将最近学的求最大公约数的四种方法总结如下: 第一种:穷举法之一 解释:拿其中一个数出来,用一个临时变量(tem)保存,每次都把那两个数除以这 ...

  4. 四种方法求字符串长度

    使用四种方法求字符串的长度 话不多说, 直接上代码: #include<stdio.h> #include<string.h>//计数器方法 int my_strlen1(ch ...

  5. 如何用计算机求最小公倍数的方法,快速求最小公倍数的四种方法(小学的题目额!) 假如用C求呢??...

    快速求最小公倍数的四种方法 最近,在教学国标本五年级下册关于求最小公倍数时,从学生反映的作业情况来看,学生还是很容易做错的,为此我总结出了四种如何求最小公倍数的方法. 如果两个数是互质数(即两数的最大 ...

  6. 四种方法求最大公约数

    一.题目分析 实验题目:运行最大公约数的常用算法,并进行程序的调式与测试,要求程序设计风格良好,并添加异常处理模块(如输入非法等). 分析:运用四种算法分别计算最大公约数,并选择手动输入数据验证算法正 ...

  7. Java求两集合中元素交集的四种方法对比总结

    hello,你好呀,我是灰小猿,一个超会写bug的程序猿! 最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑 ...

  8. 求最大子序列和的四种方法

    求一个给定序列的连续子序列中和最大的那个子序列的和,下边方法只求和,没有找出最大子序列. 用到的头文件和宏定义如下 #include "stdafx.h" #include< ...

  9. js习题(求两个数的和的四种方法)

    不推荐使用递归,递归使用太多会导致栈溢出 <!DOCTYPE html> <html lang="en"><head><meta char ...

最新文章

  1. 【牛客每日一题】tokitsukaze and Soldier 题目精讲 贪心、优先队列、堆
  2. stm32f103电子钟心得体会_浅谈STM32_RTC闹钟
  3. Java 三大特性之——继承
  4. ubuntu桌面美化mac_Ubuntu18.04美化主题(mac主题)
  5. js语音播报android浏览器,JS 简单调用百度TTS接口实现语音朗读
  6. appserv+win8
  7. Oracle_11g_R2数据库在Windows_Server_2008_R2企业版中安装
  8. webservice 实现通知支付结果到OA
  9. 常见电脑病毒及解决措施
  10. Zabbix全网监控
  11. SPSS之双独立样本的T检验
  12. 文档数据库与关系数据库的比较
  13. linux mysql端口被占用解决方法_3306端口被占用导致MySQL无法启动
  14. 改进YOLOv5系列:最新ConvNeXt结合YOLO | CVPR2022 多种搭配,即插即用 | Backbone主干CNN模型
  15. UP《人生七年》BBC纪录片
  16. Unity格子类三消游戏【物体下落】小细节(Unity萌新的备忘录)
  17. new new Foo().getName()面试题解析
  18. 目前 流行到 TTS软件 和 发音库
  19. 在Java中将二进制数转化成十进制数
  20. 自动驾驶开发中的地图

热门文章

  1. form builder画布跟着鼠标滚轮上下跳动
  2. AST还原技术专题:一键处理obfuscator混淆代码后的扫尾工作
  3. Dreamweaver及网页设计常见问题 365个
  4. SpringBoot注解详解
  5. arcgis js api4.x 加载注记符号text symbol 控制台报错解决
  6. Kronos银行木马的前世今生
  7. 常见PHP数组函数 sort,asort,ksort比较
  8. 快速排序算法 c语言实现
  9. C#文字跟随鼠标移动
  10. 2017-2018-2 20179202《网络攻防技术》第六周作业