1005继续3n+1猜想

  • 根据题目的意思可以知道只要中心思路就是对所有元素进行验证卡拉兹,找出没有被其他元素进行覆盖的元素,这些元素就是关键字
#include<stdio.h>
int main()
{
    int i,j=0,book[101]={0},n,num[100]={0},t;//num[]用于存储数据元素,book[]用于标记被其他元素覆盖的元素的下标
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&num[i]);
    }
    for(i=0;i<n;i++)
    {
        t=num[i];//令t等于当前数据元素,然后对t进行运算(有个小错误,在刚开始的时候直接对num[i]进行计算了,导致原来的数据元素都变化了,最后输出结果全部错误)
        while(t!=1){//当前数据不为1就一直进行运算
            if(t%2==0)
            t=t/2;
            else
            t=(3*t+1)/2;
            for(j=0;j<n;j++)//遍历整个数据元素,如果有元素与在t的每次计算结果中有相同的,那么就标记相应的book下标为1;
            {
                if(num[j]==t)
                    book[j]=1;
            }
        }                           
    }
    for(i=0;i<n;i++)//遍历前n个标记数组book,如果对应下标book标记为1,说明该下标对应num数据元素被其他元素覆盖过,则让该元素=0
    {
        if(book[i]==1)
        {
            num[i]=0;
        }
    }
    for(i=0;i<n;i++)//对num数组进行选择排序,让其从大到小进行分布
    {
        for(j=i+1;j<n;j++)
        {
            if(num[j]>num[i])
            {t=num[i];num[i]=num[j];num[j]=t;}
        }
    }
    for(i=0;num[i]>0;i++)//遍历num数组中不为0的前面的数组进行输出
    {
        if(num[i+1]!=0)
            printf("%d ",num[i]);
        else
            printf("%d",num[i]);
    }
    return 0;
}
  • 可以简化代码,不用book数组标记,直接让对应的num数组元素=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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值