一、问题描述
二、问题分析
? ? ? ? 一开始看到这种类型的题目,我进行了找规律的尝试,于是,没尝试出来,最后选择了暴力破解。用暴力破解的方法,根据题干可以很简单地写出代码。(写到这里,我想说明,我的两种代码实现会尽可能地尝试不同的方法,故有时可能会觉得 Python 的代码冗余,而在这题,我仅仅想试试 Python 中的 yield)
? ? ? ? 那么,本书的作者说,即使不限制上限为 10000,也不会再有这种数字,我没整出来为啥,有知道的可以留言。
三、代码实现
1.C/C++实现
#include <iostream>
using namespace std;
int judge(int n)
{
int temp = 3 * n + 1;
while (temp != 1 && temp != n)
{
temp = temp % 2 == 0 ? temp / 2 : 3 * temp + 1;
}
return temp == n ? true : false;
}
int main()
{
int count = 0;
for (int i = 2; i <= 10000; i += 2)
{
if (judge(i))
{
count++;
}
}
cout << count << endl;
return 0;
}
2.Python实现
# coding=utf-8
def judge(n):
temp = 3 * n + 1
while temp != 1 and temp != n:
temp = temp / 2 if temp % 2 == 0 else 3 * temp + 1
if temp == n:
return True
return False
def get_nums():
for i in range(2, 10001, 2):
if judge(i):
yield i
if __name__ == '__main__':
nums = [i for i in get_nums()]
print(nums, len(nums))
|