The Collatz Sequence 题解

题目传送门

题目大意

根据题目中的规定生成序列,问有多少次计算;注意输入以“\(\ -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;
}

注意输出格式!

posted @ 2022-12-25 07:55  Ggsddu_zzy  阅读(12)  评论(0编辑  收藏  举报