算法竞赛入门经典 第二章 循环

数据统计2

题目:输入一些整数,求出最小值,最大值,平均值(保留三位小数),保证这些数都不超过1000
输入: 输入包含多组数据,每组数据第一行是整数个数n,第二行是n个整数。n=0为结束标记,程序应当忽略这组数据。相邻两组数据间应输出一个空行
样例输入:
8
2 8 3 5 1 7 3 6
4
-4 6 10 0
0
样例输出
Case 1: 1 8 4.375
(空行)
Case 2: -4 10 3.000

int main()
{
    int n = 0, kase = 0, x = 0;
    int min = INF, max = -INF;
    while( scanf("%d", &n) == 1 && n )
    {
        int sum = 0;
        int i;
        for( i = 0; i < n; i++)
        {

            scanf("%d", &x);
            sum += x;
            if( min > x) min = x;
            if( max < x) max = x;

        }
        if( kase ) printf("\n");
        printf("Case: %d: %d %d %.3f", ++kase, min, max, (double)sum / n);

    }
    return 0;
}
  1. 题目说了n = 0为输入结束标记,为什么还要判断scanf返回值呢?
    答案是为了robustiness,题目是人设计的,难免会出错,有时指明以n=0结标志而真实数据忘记以n=0结尾,如果程序可以自动处理好有瑕疵的数据,会节省不少时间。
  2. kase的使用,当前数据编号,当输出第二组或以后的结尾时,会在前面加一个空行,符合题目“相邻两组数据的输出以空行隔开”的规定,注意,最后一组数据的输出会以回车符结束,但之后不会有空行。
  3. 找BUG,在样例输入的最后增加第三组数据: 1 0,会出错。
    原因是: min max没有重置,仍然是上个数据结束后的值。
    提示: 在多数据的题目中,一个常见的错误:在计算玩一组数据后某些变量没有重置,影响到下组数据的求解。
    解决办法是,把min 和 max定义在while循环中,这样每次执行循环时,会初始化min max.

解题报告

分数化小数

题目:输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b<=10^6,c<=100.
输入包含多组数据,结束标记为a=b=c=0
样例输入:
1 6 4
0 0 0
样例输出:
Case 1:0.1667

主要思路: 提高除法精度
首先输出x/y的整数部分,对其余数u=x%y试商n次,以满足精度要求。
每次试商:x=u*10为被除数,y为除数,商x/y(整数)作为结果的一位打印输出,余数为u=x%y。若u不等于0,继续试商,直到u=0或是达到试商的n位为止。

int main()
{
   int a = 0, b = 0, c = 0, kase = 0;
   while( scanf("%d%d%d",&a, &b, &c) == 3 && a && b && c)
   {
       int i = 0;
       int ans = 0;
       int remain = 0;
       printf("Case %d: ", ++kase);
       for( i = 0; i <= c; i++)
       {
           ans = a / b;
           remain = a % b;
           if( i == c && ans >=5  )
           {
               ans++;
           }
           printf("%d", ans);
           if( c > 0 && i == 0)
           {
               printf(".");
           }
           a = remain * 10;
       }
       printf("\n");
   }
    return 0;
}

参考资料链接

你可能感兴趣的:(编程语言)