2015-06-23 70 views
-3

当我尝试与stdinput-这段代码为什么会给出意想不到的结果?

4 
1 
8 
26 
52 

输出I得到为 -

1 
6 
12 
12 

代替0 1 6 12运行此片的代码 -

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

long long fact(long long k) 
{ return k/5 + k/25; 
} 
int main() 
{ 
    long long n,k; 
    scanf("%lld %lld", &n,&k); 
    while(n--) 
    { 
     scanf("%lld",&k); 
    printf("%d\n",fact(k)); 
} 
} 

有人可以解释这个意外的结果吗?

+4

为什么不逐行通过您的算法逐行在纸上找出? :)是不是第一个'scanf'调用可疑?你从不在一行中输入两个数字。对于我所知道的,这是有效的,因为我不使用像'scanf'这样古老而过时的技术。 –

+0

我也尝试过使用'cin cout'而不是'scanf printf',但代码仍然失败 – Backspace

+0

现在应该开始学习如何使用调试器了。 –

回答

3

你的代码是打破在两个地方:

int main() 
{ 
    long long n,k; 
    scanf("%lld", &n); // <<< only read n here, not n and k 
    while (n--) 
    { 
     scanf("%lld", &k); 
     printf("%lld\n", fact(k)); // <<< use %lld for long long 
    } 
} 

注意,如果你已经启用了警告编译(例如gcc -Wall ...),那么你的编译器会指出了第二个错误。

LIVE DEMO

+0

对不起,我错过了第一个;)我如何在我的编译器中启用警告。我在Ubuntu中使用Gcc 4.8.4 – Backspace

+0

在命令行开关中添加'-Wall'。 –

3

您正在阅读的额外k,这不是必需的。

scanf("%lld %lld", &n,&k); 

你不需要输入,因为它不使用上述k,但它算作输入。如果您改用这种方式输入:

4 // scanf("%lld %lld", &n,&k); --> reads n 
1 // scanf("%lld %lld", &n,&k); --> reads k 
1 // scanf("%lld", &k); --> reads k for n=4 
8 // scanf("%lld", &k); --> reads k for n=3 
26 // scanf("%lld", &k); --> reads k for n=2 
52 // scanf("%lld", &k); --> reads k for n=1 

您将得到正确的输出。因此,除去额外的参数在scanf:

scanf("%lld",&n); 
0

是在很久很久其实方法传递的第一个值是8 所以,你的输出将是1 K个第一值由第二个电话覆盖。

相关问题