2 条题解
-
0
这道题开头给出了 的数据范围,但实际的x取值范围仅在之间,所以可以放心使用int进行数值模拟。
模拟的思路参考代码的注释部分。#include<bits/stdc++.h> using namespace std; int main() { /* * x为被传递小朋友的编号(初始x可视为第一个被传递小朋友) * ans为题目要求输出的传递次数 * num为计算器当前数值 */ int x, ans, num; ans = 0; num = 0; cin >> x; /* * 这里使用while循环,但显然num的初始数值保证了至少能有一次执行 * 循环条件当计算器个位数不是3时进行下一次循环(即计算器的传递) */ while (num % 10 != 3) { /* * 进入当前循环节说明进行了一次传递,执行传递必定产生的操作 * 即传递次数+1,计算器数值加上被传递小朋友的编号 */ ans++; num += x; /* * 从题目给于的流程来说,这里应当进行判断是否终止循环 * 但显然从逻辑上来说这是一段废代码 * 因为后面步骤只会改变x的值,不会影响循环终止条件的判断 * 也不会影响结果输出(在满足终止条件的时候不会走到下一个ans++处) * 所以在这里终止或直接在下一次while判断时终止,结果是一样的 */ if (num % 10 == 3) { break; } //由当前被传递小朋友的编号,计算下一个小朋友的编号用于下一次循环的执行 if (x % 2 == 0) { x = x / 2; } else { x = 3 * x + 1; } } //输出ans的传递次数 cout << ans; return 0; }
信息
- ID
- 14262
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 72
- 已通过
- 41
- 上传者