循环的代价

例题2-4:阶乘之和

输入n,计算s=1!+2!+3!+……+n!的末6位(不含前导0)n<=10000.

样例输入:

10

样例输出:

37913

实现一:

#include <stdio.h>
int main()
{
	int n,s=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int factorial=1;
		for(int j=1;j<=i;j++)
			factorial=factorial * j;
		s=s+factorial;
	}
	printf("%d\n",s%1000000);
	return 0;
}

实现一中运行输入100,输出-961703,明显溢出了,所以要采用实现二中的算法来实现,实际上25的阶乘有六个0,在25之后(包含25)的阶乘对结果无影响,所以当n>24时只需计算1!+2!+……+24!

实现二:

/*输入n,计算s=1!+2!+3!+……+n!的末六位(不含前导零)*/
#include <stdio.h>
/*从40开始答案就不便了,聪明的读者已经知道了,25!末尾有6个零,所以从第25项开始后面的项都不会影响和的末六位数字*/
int main()
{
	const int MOD=1000000;
	int n,s=0;
	scanf("%d",&n);
	if(n>24)
		n=24;
	for(int i=1;i<=n;i++)
	{
		int factorial=1;
		for(int j=1;j<=i;j++)
			factorial=(factorial * j % MOD);
		s=(s+factorial)%MOD;
	}
	printf("%d\n",s);
	return 0;
}
时间: 2024-08-07 17:01:18

循环的代价的相关文章

算法竞赛入门 (一)语言篇 循环结构

掌握清单: for while do..while 循环 计数器和累加器 用输出中间结果的方法调试 用计时函数测试程序的效率 用重定向方式读写文件 用fopen方式读写文件 用条件编译指示构建本地运行环境 用编译选项 -Wall 获得更多的警告信息 一.for循环 程序1:for循环输出 #include<stdio.h> int main(){ int n; scanf("%d",&n); for(int i = 1;i <= n;i++) printf(&

《算法竞赛入门经典(第二版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧.全书内容分为12 章,包括程序设计入门.循环结构程序设计.数组和字符串.函数和递归.C++与STL入门.数据结构基础.暴力求解法.高效算法设计.动态规划初步.数学概念与方法.图论模型与算法.高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量例题和习题.书中的代码规范.简洁.易懂,不

DBA 培训相应内容笔记

014-12-23 slow hang lock 三种常见性能问题 hang;整个数据库不响应,无法创建新连接. hanganalyze输出. dump文件是否有问题信息, 文件是否有其他信息 工具:AWR . 10046, ORADBUG, RDA, SQL TRACE, PL/SQL 优化器: RBO CBO CHOOSE FIRST_ROWS ALL_ROWS ROWID RECURSIVE CALLS ROW SOURCE PREDICATE (WHERE条件) DRIVING TABL

DirectX11--HLSL语法入门

前言 编写本内容仅仅是为了完善当前的教程体系,入门级别的内容其实基本上都是千篇一律,仅有一些必要细节上的扩充.要入门HLSL,只是掌握入门语法,即便把HLSL的全部语法也吃透了也并不代表你就能着色器代码了,还需要结合到渲染管线中,随着教程的不断深入来不断学习需要用到的新的语法,然后尝试修改着色器,再根据实际需求自己编写着色器来实现特定的效果. 注意:在翻阅HLSL文档的时候,要避开Effects11相关的内容.因为当前教程与Effects11是不兼容的. DirectX11 With Windo

关于优化for循环的注意的事项

for循环注意事项: 1.for循环内部尽量少做数据库查询之类的IO代价大的操作 2.尽量控制for循环的次数,不多做无用功 3.能一次加载在内存中的,就不要通过循环来多次查询数据库,除非数据量过大. 起因: 前两天优化一个统计功能的页面,客户反映说,点击页面的查询按钮要等快十秒中数据才加载出来,然后点击导出按钮后,加载时间快翻一倍了.让我查一下看看能不能优化. 仔细看了一下代码,才发现代码问题太大了. 发现问题: 描述一下优化前大致结构: 1.从相关主表中获取所有工单信息,存储到dataset

线性链表其他种类(静态,双向,循环)的存储结构和常见操作

一.静态单链表 在不支持动态空间分配的环境中,要使用链表存储数据,那么可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针链来构成链式结构. //既然是静态链表,那么可以使用一维数组实现存储,java没有指针,那么就用这来使用链表结构 //在不支持动态空间分配的环境中,要使用链式结构技术,可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针. //存储结构:在数组中增加一个“指针”域,存放下一元素在数组中的下标.且0为代表空指针 //设S为SLinkList型变量,若第i

理清递归、迭代、循环的概念

loop.iterate.traversal和recursion这几个词是计算机技术书中经常会出现的几个词汇.众所周知,这几个词分别翻译为:循环.迭代.遍历和递归.乍一看,这几个词好像都与重复(repeat)有关,但有的又好像不完全是重复的意思.那么这几个词到底各是什么含义,有什么区别和联系呢?下面就试着解释一下. 循环(loop),指的是在满足条件的情况下,重复执行同一段代码.比如,while语句. 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项.比如,for语句.大都会娱乐

【BZOJ2510】弱题 期望DP+循环矩阵乘法

[BZOJ2510]弱题 Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个球标号为k(k < N),则将它重新标号为k + 1:若这个球标号为N,则将其重标号为1.(取出球后并不将其丢弃) 现在你需要求出,经过K次这样的操作后,每个标号的球的期望个数. Input 第1行包含三个正整数N,M,K,表示了标号与球的个数以及操作次数. 第2行包含N个

算法学习之循环和递归

[摘要] 大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的.原理上讲,所有递归都是可以消除的,代价就是可能自己要维护一个栈.而且我个人认为,很多情况下用递归还是必要的,它往往能把复杂问题分解成更为简单的步骤,而且很能反映问题的本质.循环和递归其实存在一定的联系.  1)求和递归函数 我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会这么写: int calculate(int m) { i