gpt4 book ai didi

c - 使用 while(scanf ("%d",&n)!=EOF) 和 while(scanf ("%d",&n) && n!=EOF) 之间的时间间隔

转载 作者:太空宇宙 更新时间:2023-11-04 00:24:40 26 4
gpt4 key购买 nike

我的问题不是关于算法,而是关于 C 编程语言的一些令人困惑的问题。我遇到了如下问题:

问题描述

N! (N 阶乘)对于 N 的大值可能非常烦人且难以计算。因此,我不想计算 N!,而是想知道其中有多少位数字。 (记住 N!= N * (N - 1) * (N - 2) * ... * 2 * 1)

输入

输入的每一行都有一个整数 N 0 < N < 1000000(一百万)。输入在文件末尾终止。

输出

对于 N 的每个值,打印出 N! 中有多少位数字。

我的代码是这样的:

 #include<stdio.h>
int main()
{
int n ;
while(scanf("%d",&n)&&n!=EOF)//1
//while(scanf("%d",&n)!=EOF)//2
{
int result=1;
int i;
double temp = 1;
for(i=n;i>0;i--)
{
temp*=i;
while((temp/10)>1)
{
result++;
temp=temp/10;
}
}
printf("%d\n",result);
}
return 0;
}

当我使用while(scanf("%d",&n) && n!=EOF)时,我使用的Online judge显示Time Limit Exceeded,当我将其更改为 while(scanf("%d",&n)!=EOF) 时,一切顺利。我认为 n!=EOF 可能需要太多时间时间,那么EOF的本质是什么?

最佳答案

不是2句话的时间,是意思不同

下一个比较scanf读取的值和EOF,这是一个错误,scanf如果到达文件末尾将不会加载n中的任何值:

while(scanf("%d",&n) && n!=EOF)

这是检测文件结尾的正确方法:

while(scanf("%d",&n)!=EOF)

一般 EOF == -1,因为判断中的输入不包含 -1 你的程序无限循环。

如评论中所述,检查 scanf 进行了多少转换通常更好,因为它检查输入是否或多或少有效 (*)。鉴于您在格式字符串 ("%d") 中询问了 1 次转换,您可以检查 scanf 是否返回 1:

while(scanf("%d", &n) == 1)

(*) 如果你必须遵循严格的格式(例如要求数字后跟exaclty\n),某些情况下可能无法验证,最好用strtol进行转换,检查 strtol 是否使用了完整的行。

由于此特定问题来自使用在线评判的编程竞赛,因此输入格式正确,通常不需要此类测试。

关于c - 使用 while(scanf ("%d",&n)!=EOF) 和 while(scanf ("%d",&n) && n!=EOF) 之间的时间间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27673306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com