#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
int A,L,sum=0;
ios::sync_with_stdio(false);
while(1){
for(int i=1; ; i++){
scanf("%d %d",&A,&L);
cout<<"Case "<<i<<": A = ";
if(L<0 || A<0) break;
for(sum=1; ; sum++){
if(A==1) continue;
else if(A%2==0) A=A/2;
else A=A*3+1;
}
cout<<A<<", limit = "<<L<<", number of terms = "<<sum<<endl;
}
}
return 0;
}
嗚嗚~他欺負我
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
int A,L,sum=0;
ios::sync_with_stdio(false);
while(1){
for(int i=1; ; i++){
scanf("%d %d",&A,&L);
cout<<"Case "<<i<<": A = ";
if(L for(sum=1; ; sum++){
if(A==1) continue;
else if(A%2==0) A=A/2;
else A=A*3+1;
}
cout<<A<<", limit = "<<L<<", number of terms = "<<sum<<endl;
}
}
return 0;
}
嗚嗚~他欺負我
用了ios::sync_with_stdio(0);就不能再用scanf輸入啊!
樓上提到使用了 ios::sync_with_stdio(false); 之後不能使用 scanf() 是有誤的,
正確來說是使用了之後cin/cout不能與C原有的stdin/stdout(EX: scanf()/printf(), getchar()/putchar())做混用,
以下簡單說一下:
C++的cin/cout為了避免與C原有的stdin/stdout衝突所以必須與stdin/stdout做同步,
此同步的過程會額外產生運算導致效能下降,
ios::sync_with_stdio(false); 則是關閉與stdin/stdout做同步的功能,
所以混用的話會導致 輸入/輸出 有不可預期的狀況產生,
通常會是不可預期的輸入導致演算法RE或TLE、算出錯誤的結果造成WA, 或者是不可預期的輸出造成WA。
總結來說,
使用了 ios::sync_with_stdio(false); 是可以使用 scanf()/printf() 的,
只是不能與 cin/cout 做混用而已,
不過這樣就失去使用 ios::sync_with_stdio(false); 的意義就是了~
另外,
你的程式會TLE的主要問題在於break,
由於break只會跳出一層迴圈,
以你的程式該break只會跳出第9行的 for(int i=1; ; i++) ,
而再上一層的while(1)並不會跳出,
所以你的程式還會繼續運行而導致TLE~
大致上就是這樣~
希望有幫助到你~ OwO
樓上提到使用了 ios::sync_with_stdio(false); 之後不能使用 scanf() 是有誤的,
正確來說是使用了之後cin/cout不能與C原有的stdin/stdout(EX: scanf()/printf(), getchar()/putchar())做混用,
以下簡單說一下:
C++的cin/cout為了避免與C原有的stdin/stdout衝突所以必須與stdin/stdout做同步,
此同步的過程會額外產生運算導致效能下降,
ios::sync_with_stdio(false); 則是關閉與stdin/stdout做同步的功能,
所以混用的話會導致 輸入/輸出 有不可預期的狀況產生,
通常會是不可預期的輸入導致演算法RE或TLE、算出錯誤的結果造成WA, 或者是不可預期的輸出造成WA。
總結來說,
使用了 ios::sync_with_stdio(false); 是可以使用 scanf()/printf() 的,
只是不能與 cin/cout 做混用而已,
不過這樣就失去使用 ios::sync_with_stdio(false); 的意義就是了~
另外,
你的程式會TLE的主要問題在於break,
由於break只會跳出一層迴圈,
以你的程式該break只會跳出第9行的 for(int i=1; ; i++) ,
而再上一層的while(1)並不會跳出,
所以你的程式還會繼續運行而導致TLE~
大致上就是這樣~
希望有幫助到你~ OwO
感謝糾正觀念!
樓上提到使用了 ios::sync_with_stdio(false); 之後不能使用 scanf() 是有誤的,
正確來說是使用了之後cin/cout不能與C原有的stdin/stdout(EX: scanf()/printf(), getchar()/putchar())做混用,
以下簡單說一下:
C++的cin/cout為了避免與C原有的stdin/stdout衝突所以必須與stdin/stdout做同步,
此同步的過程會額外產生運算導致效能下降,
ios::sync_with_stdio(false); 則是關閉與stdin/stdout做同步的功能,
所以混用的話會導致 輸入/輸出 有不可預期的狀況產生,
通常會是不可預期的輸入導致演算法RE或TLE、算出錯誤的結果造成WA, 或者是不可預期的輸出造成WA。
總結來說,
使用了 ios::sync_with_stdio(false); 是可以使用 scanf()/printf() 的,
只是不能與 cin/cout 做混用而已,
不過這樣就失去使用 ios::sync_with_stdio(false); 的意義就是了~
另外,
你的程式會TLE的主要問題在於break,
由於break只會跳出一層迴圈,
以你的程式該break只會跳出第9行的 for(int i=1; ; i++) ,
而再上一層的while(1)並不會跳出,
所以你的程式還會繼續運行而導致TLE~
大致上就是這樣~
希望有幫助到你~ OwO
感謝糾正thanks
That's so easy.
#include <bits/stdc++.h> using namespace std; int main(){ long long int a,b,k,t,n=1; while(cin>>a>>b){ if(a<0&&b<0)return 0; k=a; t=b; long long int sum=1; while(a!=1){ if(a>b){ sum--; break; } if(a%2!=0) { sum+=1; a=3*a+1; } else { sum+=1; a/=2; } } cout<<"Case "<<n<<": A = "<<k<<", limit = "<<t<<", number of terms = "<<sum<<endl; n++; } return 0;
That's so easy.
#include <bits/stdc++.h> using namespace std; int main(){ long long int a,b,k,t,n=1; while(cin>>a>>b){ if(a<0&&b<0)return 0; k=a; t=b; long long int sum=1; while(a!=1){ if(a>b){ sum--; break; } if(a%2!=0) { sum+=1; a=3*a+1; } else { sum+=1; a/=2; } } cout<<"Case "<<n<<": A = "<<k<<", limit = "<<t<<", number of terms = "<<sum<<endl; n++; } return 0;
可以挑戰一下寫到0ms才比較有挑戰性
學會優化也很重要