1 条题解
-
0
题目分析
我们需要处理的问题涉及对输入数据的遍历和奇偶性判断。虽然题目给出的输入样例中 ,但题目并未明确说明 和 的大小关系,因此在实现时需要额外考虑 和 的相对大小。此外,我们需要高效地判断数字的奇偶性,并正确统计遍历次数。
解题思路
-
输入数据的处理:
- 输入数据中的 和 可能存在 或 的情况,因此在遍历时需要先判断 和 的大小关系。
- 如果 ,则交换 和 ,确保后续遍历始终是从小到大的顺序。
-
奇偶性判断:
- 使用位运算快速判断数字的奇偶性:
- 若 的结果为 ,则 为奇数。
- 否则, 为偶数。
- 这种方法比取模运算()更高效。
- 使用位运算快速判断数字的奇偶性:
-
遍历次数的统计:
- 遍历时需从 开始计数,避免因起始值选择错误导致统计偏差。
- 例如,若需要统计某个区间内的数字个数,应确保循环变量从区间的下限开始。
关键优化
- 交换 和 :
- 在输入后立即检查 和 的大小关系,若 ,则交换两者的值,确保后续处理的一致性。
- 位运算优化:
- 使用 代替 判断奇偶性,减少计算时间。
- 遍历起始点:
- 明确循环变量的起始值(如从 开始),避免因起始值错误导致漏算或多算。
复杂度分析
- 时间复杂度:
- 判断 和 的大小关系并交换:。
- 奇偶性判断:。
- 遍历区间 :。
- 空间复杂度:
- 仅需存储 和 的值,空间为 。
#include <iostream> #include <sstream> #include <string> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> using namespace std; //const int maxn = 100000 + 10; int panduan(int n) { int i; for (i = 0; n != 1; i++){ //注意:如果看循环多少次,都是从0开始算完一遍之后开始计 if (n & 1) // 判断为奇数 n = 3 * n + 1; else // 判断为偶数 n = n / 2; } return i+1; } int main(){ int i,j; while (cin>>i>>j) { int m = min(i, j); int n = max(i, j); int num = 0; for (int a = m; a <= n; a++) { num=max(num, panduan(a)); // 注意最大值最小值函数如何使用 } cout << i << " " << j << " " << num << endl; } return 0; }
-
- 1
信息
- ID
- 208
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者