在 Hackerearth 上发布的练习问题。
编写一个程序来打印给定范围内的数字。但是对于三的倍数打印“Fizz”而不是数字,对于五的倍数打印“Buzz”。对于三和五的倍数的数字,打印“FizzBuzz”。在每个字符串或数字后打印一个新行。
输入格式 第一行将是测试用例的数量 T。下一行将有 T 个整数,用 N 表示。
输出格式 对于每个测试用例,打印从 1 到 N 的数字。但请遵循问题陈述中给出的规则。
约束
1 <= T <= 10
N 是一个整数。
提交1:
#include <stdio.h>
int main() {
int uc;
scanf("%d",&uc);
int inp[uc];
int l=0;
for(l=0;l<uc;l++){
scanf("%d",&inp[l]);
}
for(l=0;l<uc;l++){
int s;
for(s=1;s<=inp[l];s++){
if(s%5==0&&s%3==0){
printf("FizzBuzz\n");
}else if (s%3==0) {
printf("Fizz\n");
}else if(s%5==0){
printf("Buzz\n");
}else
{
printf("%d\n",s);
}
}
}
return (0);
}
提交2:
#include <stdio.h>
int main() {
int uc;
scanf("%d",&uc);
int inp[uc];
int l=0;
for(l=0;l<uc;l++){
scanf("%d",&inp[l]);
}
for(l=0;l<uc;l++){
int k=inp[l];
int s=1;
for(s=1;s<=k;s++){
if(s%3==0&&s%5==0){
printf("FizzBuzz\n");
}else if (s%3==0) {
printf("Fizz\n");
}else if(s%5==0){
printf("Buzz\n");
}else
{
printf("%d\n",s);
}
}
}
return (0);
}
当我执行时。
第1步:输入2
第2步:输入3
第三步:输入15
我发现提交 2 比提交 1 更快。
Submission Time Memory
1 1.006 s 64KB
2 1.0058 s 64KB
现在我的问题是为什么?
最佳答案
在所有此类测试中,由于操作系统任务切换等原因,总会存在一些小缺陷。如果您想优化这些程序中的任何一个,您应该使用分析器来分析(完全机器优化的,例如使用 -O3
)代码并优化分析器识别的瓶颈。
尽管如此,如果您在完全禁用优化的情况下进行编译,第一个解决方案比第二个解决方案稍微慢一点是有道理的,因为第二个解决方案包含提升 inp[l]< 形式的微优化
在内循环之外,以便每个唯一值仅对表达式求值一次。
关于c - 为什么这个更快?提交 1 与提交 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33796107/