引言
今天在做如下题目的时候遇到了问题:
我当时的代码如下:
#include<stdio.h>
int main() {
int n, k;
double s = 0;
scanf("%d", &k);
for(n=1; s<=k; n++){
s += 1.0/n;
}
printf("%d", n);
return 0;
}
问题
当代码编译运行之后便出现了问题,按照输入输出样例来看,输入1后应该输出2, 但运行结果确实3
随后经过调试,网上查找信息后发现是对for循环语句的理解不到位
分析
一个简单的for语句有以下几部分组成
for(语句1; 语句2; 语句3){
语句4;
}
这时候我们分析一下它的执行顺序
第一次:1->2->4
第二次:3->2->4
第三次:3->2->4
…
依次进行下去,直到语句2为false
也就是说我的问题处在最后那一步的n的自增上,当不满足s<k的条件后,我以为退出循环了,此时n的值应该是标准答案的2,但此时自增运算是先于逻辑判断的
解决
经过简单的调整后,提交了最终正确的代码
#include<stdio.h>
int main() {
int n, k;
double s = 0;
scanf("%d", &k);
for(n=1;; n++){
s += 1.0/n;
if(s>k) break; //将判断语句放入循环体内,不满足直接break
}
printf("%d", n);
return 0;
}