以下代碼會死循環:
#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 來代替 iwhile (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
?遞增,而不會進入死循環。
總結:
在嵌套循環中,尤其是當內層循環修改了外層循環的控制變量時,很容易導致死循環。為了避免這種情況,可以使用臨時變量來代替外層循環的控制變量。