角谷定理:输入一个自然数,若为偶数,则把它除以 22,若为奇数,则把它乘以 33 加 11。经过如此有限次变换后,总可以得到自然数 11。
求一个数 xx 需要经过多少次变换以后可得到自然数 11。
输入格式
输入一个自然数 n(1 \le n < 2^{31})n(1≤n<231)。
输出格式
第一行输出变换的次数。
接下来一行按照变换顺序输出每次变换以后的值,每两个数中间用一个空格隔开(输出包含初始的数)。
#include <vector>
#include <iostream>using namespace std;
long long n;
vector<long long> act;
int cnt=0;
void kakutani(long long a){
act.push_back(a);
if(a == 1){
return;
}
cnt++;
if(a%2 == 0){
kakutani(a/2);
}else{
kakutani(a*3+1);
}
}
int main(){
cin >> n;
kakutani(n);
cout << cnt << endl;
bool first = true;
for(int i=0;i<act.size();i++){
if(first){
cout << act[i];
first = false;
}else{
cout<<" "<<act[i];
}
}
return 0;
}