MJUPC-006_编程挑战系列赛第六场(以代码为文,贺国庆华诞) _B.本世纪最难的编程题

原题链接: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 (33+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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grape_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值