跳转到内容

模拟法

模拟法(Simulation Method) 是一种朴素的算法思想,也最直观的算法之一,其核心思想是对问题进行描述,按照问题发生的先后、逻辑顺序,对问题的过程进行编码实现,最终解决该问题,简单来说就是,题目怎么说,你就怎么做。

模拟法的特点是直观,通常并不需要特别复杂的算法设计,只要把问题描述清楚,按照问题的逻辑编码实现即可,对于初学者来说非常适合。然而,有的问题本身细节错综复杂,模拟写的过程很容易犯错误,非常考查编程人员的代码能力。

示例:角谷猜想

题目描述

日本一位中学生发现一个奇妙的定理,请角谷教授证明,而教授无能为力,于是产生了角谷猜想。

猜想的内容:任给一个自然数,若为偶数则除以 2 ,若为奇数则乘 3 加 1 ,得到一个新的自然数后按上面的法则继续演算。若干次后得到的结果必为 1 。

请编写代码验证该猜想:求经过多少次运算可得到自然数 1 。

如:输入 22 ,则计算过程为。

22/2=11
11*3+1=34
34/2=17
17*3+1=52
52/2=26
26/2=13
13*3+1=40
40/2=20
20/2=10
10/2=5
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1

经过 15 次运算得到自然数 1 。

输入描述

一行,一个正整数 nn 。(1n200001 \le n \le 20000

输出描述

一行,一个整数,表示得到 1 所用的运算次数。

输入输出样例

输入数据

22

输出数据

15

代码实现

#include <iostream>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
while (n != 1) {
if (n % 2 == 0) n = n / 2;
else n = n * 3 + 1;
cnt++;
}
cout << cnt << endl;
return 0;
}

小结