为什么此代码会产生意外结果?

时间:2015-06-23 16:14:34

标签: c++ stdin

当我尝试运行这段代码时 -

#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));
}
}

使用stdinput-

4
1
8
26
52

我得到的输出是 -

1
6
12
12

而不是0 1 6 12。

有人可以解释这个意想不到的结果吗?

3 个答案:

答案 0 :(得分:3)

您的代码在两个地方被破解:

    public Image getColumnImage(final Object element, final int columnIndex) {
    if (columnIndex == MY_COLUMN_INDEX) {
            final MyObject myObj = (MyObject) element;
            final Image image = myObj .getImage();
            Image newImage = null;
            if(this.decorator != null) {
                newImage = this.decorator.decorateImage(image, myObj );
            }
            return newImage == null ? image : newImage;
    }
    return null;
}

请注意,如果您编译时启用了警告(例如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 } } ),那么您的编译器会指出第二个错误。

LIVE DEMO

答案 1 :(得分: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);

答案 2 :(得分:0)

long long fact方法传递的第一个值是8。 所以你的输出将是1. k第一个值被第二次调用覆盖。