乘积的末3位(product) 算法竞赛入门经典 习题3-3

乘积的末3位(product) 算法竞赛入门经典 习题3-3

  输入若干个整数(可以是正数、负数或者零),输出它们的乘积的末3位。这些整数中会混入一些由大写字母组成的字符串,你的程序应当忽略它们。提示:试试看,在执行scanf(“%d”)时输入一个字符串会怎样?
  
 
源代码如下:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXN 100

//这个字符数组用来存取含有字母的字符串 
char str[MAXN];
int main()
{
    int n,product = 1,num;

    while(1)
    {
        num = scanf("%d",&n);
        if(num == EOF)   //输入结束了,break循环,程序停止
            break;
        if(num == 1)     //输入是整数,做数据处理
            product = (product*(n%1000))%1000;
        else    //将读到的字符串放到str数组中
            fgets(str,MAXN,stdin);
    }

    printf("%03d\n",(product>=0?product:-product));
    return 0;
}

这里写图片描述

心得体会:这道题有两个地方需要注意:① 如果是使用平常刷题使用较多的while(scanf("%d",&n)==1)做输入语句,有一个bug:就是程序运行到第一次输入了字符串时就输出结果停止运行了。这与题意忽略掉字符串相背,如下图所示。必须得用while(1)来做,并且将scanf()函数的返回值作为条件来判断当前输入情况:

1) 当输入了整数时,scanf(“%d”,&n)会返回1
2)当从键盘输入了CTRL+Z,或者以文件重定向方法做输入读到文件结尾时,通常会返回EOF,在stdio中通常以常量-1存在。
3) 当输入了与scanf()格式控制不相符合的数据,比如本题输入了字符串时,会返回0,这时用printf(“%d”,n)去打印n的值,会发现是0000

product = (product*(n%1000))%1000;这样写是为了防止数据溢出,若先3个int型数据相乘,再求余可能会在相乘阶段就产生Int溢出导致程序崩溃。所以对每个数据求余后,再相乘,最后再求余这样得到的结果是一样的。

错误代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXN 100

//这个用来读取含有字母的字符串 
char str[MAXN];
int main()
{
    int n,product = 1,num;

    while(scanf("%d",&n)==1)
    {
        product = (product*(n%1000))%1000;
    }
    printf("%03d\n",(product>=0?product:-product));
    return 0;
}

这里写图片描述

posted @ 2018-03-16 14:45  Western_Trail  阅读(245)  评论(0编辑  收藏  举报