原题链接:MJUPC-006_B.本世纪最难的编程题
B.本世纪最难的编程题
题目描述
希望你没有被题目吓倒 (›´ω`‹ ),而是选择完成本世纪“最( b u bu bu)难”的编程题。
小柯在做题的时候了解到,在 1950 年,卡拉兹( C a l l a t z Callatz Callatz )在世界数学家大会上公布了一个猜想,即对任何一个正整数 n n n,如果它是偶数,将其变为原本的一半;如果它是奇数,则将其变为 ( 3 n + 1 ) / 2 (3n+1)/2 (3n+1)/2,且重复以上步骤,最终这个数会变成 1 1 1。
据说当时有不少的人都想证明出这个命题的对错,小柯也非常感兴趣,但是自己的编程水平实在是太低了,只能求助于你。
给定一个不超过 1000 1000 1000 的正整数 n n n,请你帮助小柯写一个程序来计算出将 n n n 变化到 1 1 1 所需的步骤数 k k k。输入描述
本题有多组测试样例,第一行输入一个正整数 t,代表测试样例的个数。
接下来的 t t t 行,每一行输入一个不超过 1000 1000 1000 的正整数 n n n。输出描述
在一行内输出将 n n n 变化到 1 1 1 所需要的步骤数 k k k。
输入输出样例
输入 #1:
3
输出 #1:
5
说明/提示:
【数据范围】
1 < = n < 1000 1 <= n < 1000 1<=n<1000
【说明】
示例1中,因为 3 3 3 是奇数,所以将其变化为 ( 3 ∗ 3 + 1 ) / 2 = 5 (3*3+1)/2=5 (3∗3+1)/2=5,而 5 5 5 又是奇数,变化为 8 8 8,以此类推, 3 − > 5 − > 8 − > 4 − > 2 − > 1 3->5->8->4->2->1 3−>5−>8−>4−>2−>1,从 3 3 3 变到 1 1 1 一共经历了 5 5 5 步。
【出题人】
MaLingShu_R
题目解析:
本题考察模拟。
根据题目描述,给你一个不超过 1000 1000 1000 的正整数 n n n,计算出将 n n n 变化到 1 1 1 所需的步骤数 k k k,变化规则为,偶数 n = n / 2 n=n/2 n=n/2,奇数 n = ( 3 n + 1 ) / 2 n=(3n+1)/2 n=(3n+1)/2。
因此,当 n n n 没有变化到 1 1 1 时不断循环,然后按以上的规则不断更新 n n n,并累加变化次数,直到结果为 1 1 1,输出变化次数 k k k。
AC代码(C++):
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n; cin >> n;
int cnt = 0;
while (n != 1)
{
if (n % 2 == 0) n /= 2;
else n = (3 * n + 1) / 2;
cnt++;
}
cout << cnt << endl;
return 0;
}