C++ 1001 害死人不偿命的(3n+1)猜想

一、题目

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

1、输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

2、输出格式:

输出从 n 计算到 1 需要的步数。

3、输入样例:


3

4、输出样例:


5

5、限制

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

二、思路

  1. 使用if-else语句:对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。


 if(n%2==0)//偶数
     {
         n=double(n)/2;//注意整数除法
     }
    else
     {
        n=(3*double(n)+1)/2;
     }
  1. 使用while循环语句:这样一直反复砍下去,最后一定在某一步得到 n=1。


  while(n!=1)
  1. 定义一个变量i,记录步数:对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?


 int i=0; 
while(n!=1)
    {
        i++;
    }

三、代码


#include <iostream>
using namespace std;

int main()
{
    //cout << "请输入一个不超过1000的正整数:" << endl;
    int n;
    cin >> n;//注意题目要求,输入输出限制
    int i=0;
    while(n!=1)
    {
     if(n%2==0)//偶数
     {
         n=double(n)/2;//注意整数除法
     }
    else
     {
        n=(3*double(n)+1)/2;
     }
        i++;
    }
   cout << i << endl;
   // system("paues");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 以下是C++代码: #include <iostream> using namespace std; int main() { int n; cin >> n; while (n != 1) { cout << n << " "; if (n % 2 == ) { n /= 2; } else { n = 3 * n + 1; } } cout << n << endl; return ; } 这段代码实现了“3n+1猜想”,输入一个正整数n,如果n是偶数,则将n除以2,否则将n乘以3再加1,直到n等于1为止。在每次操作后输出n的值。 ### 回答2: 题目描述:1005 继续(3n+1)猜想 这道题目让我们去思考著名的“3n+1”猜想,也称为“Collatz猜想”。所谓“3n+1”猜想,就是对于任意一个正整数n,若n为奇数,则将n变为3n+1,若n为偶数,则将n变为n/2。重复这个过程,最终都会得到1,也就是说,任何一个正整数都可以通过不停地进行“3n+1”的变化,最终得到1。 但是,不管从理论还是实际的考虑,都没有证明这个猜想成立。虽然经过无数次的尝试,这个猜想在极大程度上看来确实是正确的,但是人们还是无法确切地证明其正确性。 对于这个问题,我个人认为,我们可以从数学的角度来对其进行分析。首先,对于任何一个正整数n,我们都可以进行以下两种操作: ①.若n为奇数,则将n变为3n+1; ②.若n为偶数,则将n变为n/2。 我们可以通过考虑这两种操作对应的函数,进行进一步的分析。定义函数f(n)为将n变为3n+1的操作所得到的结果,函数g(n)为将n变为n/2的操作所得到的结果。不难发现,对于任何一个正整数n,我们都可以得到: ①.当n为奇数时,f(n)=3n+1为偶数,进而有g(f(n))=g(3n+1)=(3n+1)/2; ②.当n为偶数时,g(n)=n/2为偶数,进而有g(g(n))=g(n/2)=n/4。 综合以上两种情况,我们可以得到一个结论:如果不断地将n带入这两个函数中,最终都可以得到1。 但是,这个证明还不够严谨。比较困难的地方在于,我们无法排除一些特殊的数,其值会不停地循环,从而使得证明过程无法进行下去。针对这个问题,目前仍然没有有效的解决方法。因此,“3n+1”猜想依旧是未解决的数学难题之一。 不管怎样,这个猜想之所以引起人们无尽的探讨,主要还是因为它本身就涉及到了数学的深层次问题,不仅涉及到数论、代数学、纯粹数学等方面,还涉及到了计算机科学、信息论等实际应用领域。相信随着数学理论的不断发展,我们终将会对这个猜想有一个更加深刻的认识。 ### 回答3: 3n+1猜想是指:对于任意正整数n,如果n是偶数,则把它除以2,如果n是奇数,则把它乘以3再加1。得到的结果再按照同样的规则进行操作,直到最终得到1。据说,无论最初的n是什么,最终都会得到1,这就是3n+1猜想。 那么,问题来了,我们应该如何证明这个猜想呢?事实上,迄今为止,没有人能够证明这个猜想的正确性,也没有人能够找到反例来证明它的错误性。 针对这个猜想的研究早在20世纪初就已经开始了,但是至今仍然没有找到确凿的证据来证明它的正确性。有一些数学学者通过计算机模拟,发现对于n<268,可以得到1,这些数被称为3n+1问题的朴素范围,有些学者认为对于n的所有值都是成立的。 虽然没有找到真正的证据,但是3n+1猜想已经被广泛接受,并成为了数学上的一个有名的问题,它的重要性在于它为数学提供了一种新的、有趣的思考方式。通过研究这个问题,我们可以深入了解自然数的性质和规律,也可以得到更多的启示。因此,无论是从学术的角度还是从趣味的角度,3n+1猜想都是值得我们探索的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cyt涛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值