寻找一个C程序,它可以检测类似于Collatz猜想的序列是否终止

寻找一个C程序,它可以检测类似于Collatz猜想的序列是否终止,c,algorithm,C,Algorithm,我正在寻找一个C语言的程序,它可以: 扫描一个最大为10^14的无符号数字 如果是偶数,则将其除以2 否则将其替换为3*n+3(n为数字 这是扫描),使它成为一个偶数 尽可能多地这样做 根据需要进行多次,以查看最后是否等于1。如果是,请打印 “是”,否则打印“否” 问题是,我不知道什么时候停止这个操作,我也不确定除了2^x以外的任何数字最后是否能等于1,但我认为我错了。有人能帮我吗?一个问题是,在循环查找过程中,您可能会得到一些相当大的数字,这些数字会溢出所有内置类型的C 相反,你可以用数学

我正在寻找一个C语言的程序,它可以:

  • 扫描一个最大为10^14的无符号数字
  • 如果是偶数,则将其除以2
  • 否则将其替换为3*n+3(n为数字 这是扫描),使它成为一个偶数
  • 尽可能多地这样做 根据需要进行多次,以查看最后是否等于1。如果是,请打印 “是”,否则打印“否”

问题是,我不知道什么时候停止这个操作,我也不确定除了2^x以外的任何数字最后是否能等于1,但我认为我错了。有人能帮我吗?

一个问题是,在循环查找过程中,您可能会得到一些相当大的数字,这些数字会溢出所有内置类型的C

相反,你可以用数学方法解决这个问题。还有一个更难、更相似的问题:,但这个问题很简单。考虑<代码> 3n+1=3(n+1)< /代码> - 3的倍数。3的倍数不能是2的幂

因此,要么初始数字是2的幂(然后打印“是”),要么它永远不会变成2的幂(打印“否”)

#包括
#包括
#包括
int main(){
uint64\u t n;
//获取输入
scanf(“%”SCNu64,&n);
//检测n是否为2的幂
而(n>1){
如果(n%2!=0){
printf(“no\n”);//不是2的幂
返回0;
}
n/=2;
}
//是2的幂
printf(“是\n”);
}

@user202729我知道,但我不知道什么时候停止循环。请告诉我们目前为止的代码,也许我们可以帮助您从编号n0开始,然后生成n1,然后生成n2,等等。。。如果您在运行过程中存储了所有号码,并且对于每个新号码,您都要检查您是否尚未生成该号码。如果数字重复,你有一个循环,你可以停下来。@Fabio这是有道理的,但我不知道怎么做。我试过了,但是太麻烦了-让我们看看你的尝试。StackOverflow希望您能这样做,因为您的尝试有助于我们更好地了解您的需求。请编辑此问题,以说明您在某个问题中遇到的具体问题。有关更多信息,请参阅并使用.C。它对数字的大小没有固有的限制,甚至对它所代表的数字的大小也没有固有的限制。也许您的意思是,它没有内置的任意精度数字类型,但可以使用任意精度库,例如。。。。用C语言实现。使用外部库来实现这样的事情是一种方便,也许是一个很大的方便,但它并不能说明语言的功能。好的,我接受并编辑了这一点。也许说它是一种糟糕的语言是主观的——当你不得不用它来编写面试、竞争性编程或学习练习时,就像我认为OP所做的那样,这很不方便。
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>

int main() {
    uint64_t n;

    // get the input
    scanf("%" SCNu64, &n);

    // detect whether n is a power of 2
    while(n > 1) {
        if(n % 2 != 0) {
            printf("no\n"); // not a power of 2
            return 0;
        }
        n /= 2;
    }
    // is a power of 2
    printf("yes\n");
}