[問題] UVa 100 The 3n+1 problem

看板C_and_CPP作者 (快樂蕃茄)時間7年前 (2018/07/24 21:30), 編輯推噓3(3015)
留言18則, 8人參與, 7年前最新討論串1/1
雖然此題已經通過 AC 可是我還有一個地方弄不懂 題目: 英文 http://bit.ly/2JPfLVx 中文 https://zerojudge.tw/ShowProblem?problemid=c039 以下是通過 AC 的程式碼 #include <iostream> using namespace std; int main() { long long int i,j,n,temp,sum=1,max=0; while(cin>>i>>j) { cout<<i<<" "<<j<<" "; if(i>j){temp=i;i=j;j=temp;} //假如i大於j,則兩者交換,大數在右邊 //此 for 迴圈是對的 for(int k=i;k<=j;k++) { n=k; //一定要有這行 while(n!=1) { ++sum; if(n%2!=0){n=3*n+1;} else {n=n/2;} } if(sum>max){max=sum;} sum=1; } cout<<max<<endl; max=0; } return 0; } 我的問題是 for 迴圈改成這樣寫為什麼是錯的 //此 for 迴圈是錯的 for(n=i;n<=j;n++) { while(n!=1) { ++sum; if(n%2!=0){n=3*n+1;} else {n=n/2;} } if(sum>max){max=sum;} sum=1; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.233.112.117 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1532439052.A.671.html

07/24 21:34, 7年前 , 1F
你覺得兩個差在哪
07/24 21:34, 1F

07/24 21:45, 7年前 , 2F
下面那個 n 會一直等於 1 唷
07/24 21:45, 2F

07/25 00:18, 7年前 , 3F
while結束時你的n就等於1了,for迴圈無法如預期從i到j
07/25 00:18, 3F

07/25 10:07, 7年前 , 4F
while結束n等於1沒錯,可是為什麼for迴圈的n++沒有善盡職
07/25 10:07, 4F

07/25 10:07, 7年前 , 5F
守執行呢
07/25 10:07, 5F

07/25 10:12, 7年前 , 6F
你的n++只是讓他變成2而已呀 還是你以為第三次迴圈你的
07/25 10:12, 6F

07/25 10:12, 7年前 , 7F
n++會幫你+2?XD
07/25 10:12, 7F

07/25 12:59, 7年前 , 8F
不要惡搞控制迴圈用的變數啊QQ
07/25 12:59, 8F

07/26 02:13, 7年前 , 9F
重點在於你動到的是 n, 一被動到它就忘了它之前是幾了
07/26 02:13, 9F

07/26 02:13, 7年前 , 10F
n++ 確實善盡職守了, 只是因為 n 已經忘了它先前是多少
07/26 02:13, 10F

07/26 02:14, 7年前 , 11F
它只知道它現在是 1 所以就加一變成 2 而已
07/26 02:14, 11F

07/26 11:23, 7年前 , 12F
https://ideone.com/2Za45R 改成這樣應該就會對了
07/26 11:23, 12F

08/01 20:36, 7年前 , 13F
看起來原文那個錯的for迴圈有問題,會變成無限迴圈,
08/01 20:36, 13F

08/01 20:36, 7年前 , 14F
試推演如下:第一次迴圈n等於i,進入while迴圈後n等於1
08/01 20:36, 14F

08/01 20:37, 7年前 , 15F
接著第二次迴圈n++,n會等於2,進入while迴圈後n又等於1
08/01 20:37, 15F

08/01 20:37, 7年前 , 16F
第三次迴圈n++,n又等於2,進入while迴圈後n又等於1
08/01 20:37, 16F

08/01 20:39, 7年前 , 17F
n的值就在1和2中反覆變動,造成無限迴圈...
08/01 20:39, 17F

08/01 20:39, 7年前 , 18F
所以這個寫法,是行不通的,終於懂了,感謝各位。
08/01 20:39, 18F
文章代碼(AID): #1RLoeCPn (C_and_CPP)