#include<iostream> using namespace std; int main(){ long long int a,b,i,n,t,max=0,sum=1; while(cin>>a>>b){ cout<<a<<" "<<b<<" "; if(a>b) {t=a; a=b; b=t;} for(i=a; i<=b; i++){ n=i; while(n!=1){ sum++; if(n%2!=0) n=3*n+1; else n/=2; } if(sum>max) max=sum; sum=1; } cout<<max<<endl; max=0; } }
會TLE,請各位大大教一下
#include using namespace std; int main(){ long long int a,b,i,n,t,max=0,sum=1; while(cin>>a>>b){ cout<<a<<" "<<b<<" "; if(a>b) {t=a; a=b; b=t;} for(i=a; i<=b; i++){ n=i; while(n!=1){ sum++; if(n%2!=0) n=3*n+1; else n/=2; } if(sum>max) max=sum; sum=1; } cout<<max<<endl; max=0; } }
會TLE,請各位大大教一下
都是YP的,提供你幾個意見
運算法:
1.n/=2替換成n>>1,用位元平移處理比較快,比用除法快了6倍左右
2.n*3+1的結果必為偶數,直接跳到n>>1,減少判斷次數
3.把跑過的數字存起來,減少重複跑的次數
輸入輸出:
1.加入ios::sync_with_stdio(false);關閉cin,cout與scanf,printf的同步
2.加入cin.tie(0);使cin,cout鬆綁
3.把endl換成'\n'