2015-06-23 71 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個第一值由第二個電話覆蓋。

相關問題