乘积的末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;
}