考拉斯猜想(冰雹猜想)用c语言完成?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了考拉斯猜想(冰雹猜想)用c语言完成?相关的知识,希望对你有一定的参考价值。

#include <stdio.h> int main() int num; scanf("%d,&num"); int cnt=1; while(num>=1) if(num%2==0) num /= 2; else num = num*3+1; printf("第%d次,%d\n",cnt,num); cnt++; return 0;

度娘自动排版有问题,看图

输入语句有误,应为

scanf("%d", &num);

参考技术A ? 程序如下: #include<stdio.h> int sushu(int n) int i,s; s=1; for(i=2;i<=n/2;i++) if(n%i==0) s=0; break; return s; int main() int n,i; for(i=6;i<1000;i=i+2) for(n=2;n<i;n++) if(sushu(n)) if(sushu(i-n)) printf( %d %d\n ,n,i-n); break; return 0; 为什么不能完全输出呢??好像只有一部分,如果把1000改为600以下又可以了。为什么? 进入cmd命令窗口,改窗口属性,把缓冲区改到1000行,再在这个窗口下运行你的程序,就可以上下的拉滚动条看到完整的输出 参考技术B ? 程序如下: #include<stdio.h> int sushu(int n) int i,s; s=1; for(i=2;i<=n/2;i++) if(n%i==0) s=0; break; return s; int main() int n,i; for(i=6;i<1000;i=i+2) for(n=2;n<i;n++) if(sushu(n)) if(sushu(i-n)) printf( %d %d\n ,n,i-n); break; return 0; 为什么不能完全输出呢??好像只有一部分,如果把1000改为600以下又可以了。为什么? 进入cmd命令窗口,改窗口属性,把缓冲区改到1000行,再在这个窗口下运行你的程序,就可以上下的拉滚动条看到完整的输出

LQ0052 冰雹数枚举+角谷猜想

题目来源:蓝桥杯2016初赛 C++ C组G题

题目描述
任意给定一个正整数N,如果是偶数,执行: N / 2;如果是奇数,执行: N * 3 + 1
生成的新的数字再执行同样的动作,循环往复。
通过观察发现,这个数字会一会儿上升到很高,一会儿又降落下来。
就这样起起落落的,但最终必会落到“1”
这有点像小冰雹粒子在冰雹云中翻滚增长的样子。
比如N=9:9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。

输入格式
输入存在多组测试数据,对于每组测试数据输入一行包含一个正整数N(N<1000000)

输出格式
对于每组测试数据,输出一行包含一个正整数表示答案

输入样例
10
100
输出样例
52
9232

问题分析
这个题实际上是角谷猜想的变形。
这个题的描述有BUG,其意思是对于给定的N, 从1-N计算角谷猜想的数列,找出最大值。
对于输出的N,用暴力法来实现是一种方法,但是会有很多重复的计算。
采用打表法会快许多。
需要注意的是,有可能数会比较大,要用long long类型。

AC的C语言程序(打表法)如下:

/* LQ0052 冰雹数 */

#include <stdio.h>
#include <string.h>

#define N 1000000 + 1
long long a[N];

long long geta(int n)

    long long t = n, maxt = n;
    while (t != 1) 
        if (t % 2 == 0)
            t /= 2;
        else
            t = t * 3 + 1;
        if (t <= N && a[t] != 0) 
            maxt = a[t] > maxt ? a[t] : maxt;
            return maxt;
        
        maxt = t > maxt ? t : maxt;
    
    return maxt;


int main()

    memset(a, 0, sizeof a);
    a[1] = 1;
    for (int i = 2; i <= N; i++) 
        long long t = geta(i);
        a[i] = a[i - 1] > t ? a[i - 1] : t;
    

    int n;
    while (~scanf("%d", &n))
        printf("%lld\\n", a[n]);

    return 0;

AC的C语言程序(暴力)如下:

/* LQ0052 冰雹数 */

#include <stdio.h>

int main()

    int n;
    while (~scanf("%d", &n)) 
        long long maxa = n;
        for (int i = 2; i <= n; i++) 
            long long t = i;
            while (t != 1) 
                if (t % 2 == 0) t /= 2;
                else t = t * 3 + 1;
                maxa = t > maxa ? t : maxa;
            
        

        printf("%lld\\n", maxa);
    

    return 0;

以上是关于考拉斯猜想(冰雹猜想)用c语言完成?的主要内容,如果未能解决你的问题,请参考以下文章

用Perl语言编写冰雹猜想程序

考拉兹猜想,

LQ0052 冰雹数枚举+角谷猜想

Python实现Collatz序列(考拉兹猜想)

c语言编程 奇偶归一猜想步数 急求,多谢!!

C语言案例教程详解