为什么这段代码会产生意想不到的结果?
Why is this code giving unexpected results?
当我尝试 运行 这段代码时-
#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
1
8
26
52
我得到的输出是-
1
6
12
12
而不是 0 1 6 12 。
谁能解释一下这个意想不到的结果?
您的代码在两个地方被破坏:
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 ...
),那么您的编译器会指出第二个错误。
您正在阅读额外的 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);
long long fact方法传入的第一个值是8。
所以你的输出将是 1. k 第一个值被第二次调用覆盖。
当我尝试 运行 这段代码时-
#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
1
8
26
52
我得到的输出是-
1
6
12
12
而不是 0 1 6 12 。
谁能解释一下这个意想不到的结果?
您的代码在两个地方被破坏:
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 ...
),那么您的编译器会指出第二个错误。
您正在阅读额外的 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);
long long fact方法传入的第一个值是8。 所以你的输出将是 1. k 第一个值被第二次调用覆盖。