题目大意
根据题目中的规定生成序列,问有多少次计算;注意输入以“\(\ -1\) \(\ -1\)”结尾。
解题思路
按照题目中所说的进行模拟。
在保证 \(a\) 不大于 \(l\) 和 \(a\) 不等于 \(\ 1\) 的前提下:
如果 \(a\) 是偶数,那么\(a\)的值变为 $ \Large{\frac{a}{2}}$;
如果 \(a\) 是奇数,那么\(a\)的值变为 \(\ 3\times a+1\);
如果 \(a\) 大于 \(l\) 或者 \(a\) 等于 \(\ 1\) 了,就跳出循坏。
注意每计算一次 \(ans++\);每计算完一组要重置计数器。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
template <class T> void r(T&x){
x = 0; int w = 0; char g = getchar();
while(!isdigit(g)) {
w = (g == '-'); g = getchar();
} while(isdigit(g)) {
x = (x << 3) + (x << 1) + (g xor 48); g = getchar();
} x = w?-x:x; return;
}
ll a,l,ans=1,i=0;
int main(){
while(a!=-1&&l!=-1){
r(a),r(l);
i++;
if(a==-1&&l==-1) break;
cout<<"Case "<<i<<": A = "<<a<<", limit = "<<l<<", number of terms = ";
while(a<=l&&a!=1){
if(a%2==0){
a/=2;
ans++;
}
else{
if(a*3+1<=l){
a=a*3+1;
ans++;
}
else break;
}
}
cout<<ans<<'\n';
ans=1;
}
return 0;
}
注意输出格式!
标签:UVA694,题目,题解,Collatz,while,isdigit From: https://www.cnblogs.com/zzyblog0619/p/17003660.html