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