紫皮书--第二章(2)

1、阶乘之和(2)

#include <iostream>
#include <stdio.h>
#include<time.h>
using namespace std;

int main()
{
    const int MOD=1000000;
    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)%MOD;
        }
        S=(S+factorial)%MOD;
    }
    printf("%d\n",S);
    printf("Time used %.2f\n",(double)clock()/CLOCKS_PER_SEC);
    return 0;
}

这段代码依旧会是超时的,放在这主要是学习里面的计时函数clock()的使用,可以使用time.h和clock()函数获得程序运行时间。常数CLOCKS_PER_SEC和操作系统相关,请不要直接使用clock()的返回值,而应总是除以CLOCKS_PER_SEC。

还有一点是要计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在每步计算之后对n取余,结果不变。这个思想貌似经常遇到。

在测试代码检查错误时,采用输出中间结果和计时函数是很常用和实用的。

2、输入输出重定向语句

freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);

上述语句将使得scanf从文件input.txt读入,printf写入文件output.txt。事实上,不只是scanf和printf,所有读键盘输入、写屏幕输出的函数都将改用文件。在算法竞赛中,如果不允许使用重定向方式读写数据,应使用fopen和fscanf/fprintf进行输入输出。尽管这样做很方便,并不是所有算法竞赛都允许用程序读写文件。甚至有的竞赛允许访问文件,但不允许用freopen这样的重定向方式读写文件。参赛之前请仔细阅读文件读写的相关规定。(这个部分觉得不太用得到没有仔细看去实践,以后碰到再回来看吧。)

3、数据统计2

#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;

int main()
{
    int n,kase=0;
    while(scanf("%d",&n)&&!(n==0))
    {
        int str[n],sum=0;
        for(int i=0;i<n;i++)
            scanf("%d",&str[i]);
        sort(str,str+n);
        for(int j=0;j<n;j++)
            sum+=str[j];
        if(kase) printf("\n");
        printf("Case %d:%d %d %.3f\n",++kase,str[0],str[n-1],(float)sum/n);
    }
    return 0;
}

书中比较警醒我的一段话是:有时会出现题目指明以n=0为结束标记而真实数据忘记以n=0结尾的情形。虽然比赛中途往往会修改这一错误,但在ACM/ICPC等时间紧迫的比赛中,如果程序能自动处理好有瑕疵的数据,会节约大量不必要的时间浪费。强调程序的鲁棒性。

还有一个地方,kase的使用,刚开始自己做的时候忽略了题目中要求相邻两组数据之间应输出一个空行的条件。个人觉得这里的处理还是很妙的,kase初始为0,kase不为0时在输出之前打印一行空格,把空格与“当前数据编号”计数器联系在一起。

第二章 循环结构 over~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值