“死”循环(查漏补缺)
以下代码会死循环:
#include<iostream>
using namespace std;
int n,res;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int x=i;
while(i){
int t=i%10;
i/=10;
if(t==2||t==0||t==1||t==9){
res+=x;
break;
}
}
}
cout<<res<<endl;
return 0;
}
你的代码中存在一个逻辑错误,导致程序进入了死循环。具体来说,问题出在 while(i)
这个循环中。你在 while
循环中修改了 i
的值(i /= 10
),这会导致外层 for
循环的 i
也被修改,从而导致 for
循环无法正常结束。
问题分析:
-
外层
for
循环的i
从1
到n
递增。 -
在
while(i)
循环中,i
被修改为i / 10
,这会导致i
的值在for
循环中被错误地修改。 -
当
i
被修改为0
时,for
循环的i++
会再次将i
设置为1
,从而导致死循环。
解决方法:
为了避免修改外层 for
循环的 i
,你可以在 while
循环中使用一个临时变量来代替 i
。
修改后的代码:
#include<iostream>
using namespace std;
int n, res;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
int x = i;
int temp = i; // 使用临时变量 temp 来代替 i
while (temp) {
int t = temp % 10;
temp /= 10;
if (t == 2 || t == 0 || t == 1 || t == 9) {
res += x;
break;
}
}
}
cout << res << endl;
return 0;
}
解释:
-
在
while
循环中,我们使用temp
来代替i
,这样就不会影响外层for
循环的i
。 -
这样,
for
循环可以正常地从1
到n
递增,而不会进入死循环。
总结:
在嵌套循环中,尤其是当内层循环修改了外层循环的控制变量时,很容易导致死循环。为了避免这种情况,可以使用临时变量来代替外层循环的控制变量。