| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2021 人关注过本帖
标题:关于3n+1问题,求两个数之间最大cycle length
只看楼主 加入收藏
zhq123333
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-9-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
关于3n+1问题,求两个数之间最大cycle length
程序代码:
#include <stdio.h>
int main()
{
    long n1, n2, i, m, n, cnt, maxcycle, tmp;
    
    while(scanf("%ld%ld", &n1, &n2) !=EOF){
        if(n1>n2){
            tmp=n1;
            n1=n2;
            n2=tmp;
        }
        
    for(i=n1;i>=n2;++i){
        i=m=n;
        cnt=1;
    }
        
    maxcycle=1;
    
    while(n != 1){
        if(n % 2)
            n=3*n+1;
        else
            n=n/2;
    cnt++;
    }
    
    if(cnt>maxcycle) maxcycle=cnt;
    
    }
    
    printf("%ld%ld%ld\n", m, n, maxcycle);
    return 0;
} 



版主大人指责我傲慢,那么我知错能改。

输入两个数,两个数字分别要判断是奇数偶数。

当奇数时,程式执行运算3*n+1。

当为偶数时,程式执行运算n/2。

将得出的结果反复执行上列运算,直到得到数字1时停止。

例如输入 22, 得到的数列: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

22 的 cycle length为 16

这个程式是想要找出输入的两个数字之间产生的最大cycle length。

在我编译完成这个程式后,输入资料

1 10      10 1  与 900 1000皆没有得到任何输出结果

如图所示
图片附件: 游客没有浏览图片的权限,请 登录注册


请问这是哪里发生了错误??

[此贴子已经被作者于2016-9-27 15:22编辑过]

2016-09-27 11:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
问:请问什么叫3n+1问题?
答:你TMD自己不会去Google加猜测吗?!

问:您说的“输入数据的时候pintf没有数据输出”话中输入了什么数据?我来测试一下。
答:你TMD不会一个个不停的输入试试呀,直到遇到一个没输出的就行了。

所以,很多问题其实就是一个『傲慢』的问题,包括
有闲工夫贴图,却没时间贴代码的;
说编译错误时,不肯贴错误信息的;
说运行错误时,不肯贴输入信息的;
说运行结果不对时,不肯说什么才算正确的;
贴段代码后屁都不放一个,静等着别人来猜测它想提什么问题的;
代码不贴,上来就说某某函数,或某某编译器为什么不对的;
题目要求简述为一个“小白兔问题”,问它“小白兔问题”是啥问题它还不乐意的;
………… 等等,太多了
2016-09-27 13:29
zhq123333
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-9-27
收藏
得分:0 
回复 2楼 rjsp
不好意思,第一次发贴说话不要那么冲嘛...你说我改不就行了,一上来就教训我。
2016-09-27 15:07
chenchen224
Rank: 4
等 级:业余侠客
威 望:1
帖 子:61
专家分:237
注 册:2016-8-11
收藏
得分:20 
当你输入为n1>n2时,这句话因为n没有赋值,n的大小是随机值,程序执行到这边就一直下不去了。
while(n != 1)
    {
        if(n % 2==0)
            n=3*n+1;
        else
            n=n/2;
    cnt++;
    }
当你输入为n1<n2时,这个for循环也没有进来,照样没有给n赋值。一样的不能进行下去。

for(i=n1;i>=n2;++i)
    {
        i=m=n;
        cnt=1;
    }

其实你可以用vc调试一下就知道错在哪里了。

我想做的,只是静静的把C学好,从此代码是爱人......
2016-09-27 15:27
zhq123333
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-9-27
收藏
得分:0 
回复 4楼 chenchen224
好的,谢谢你
2016-09-27 15:54
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
#include <stdio.h>
int main()
{
    long n1, n2, i, m, n;
    while((scanf("%ld,%ld",&n1,&n2))==2)
    {
        m=1;
        n=1;
        while(n1 != 1){
        if(n1 % 2)
            n1=3*n1+1;
        else
            n1=n1/2;
        m++;
        }
        while(n2 != 1){
        if(n2 % 2)
            n2=3*n2+1;
        else
            n2=n2/2;
        n++;
        }
        printf("%ld\n",n>m?n:m);
    }
   
    return 0;
}

你写的代码我是看不懂。
看看这个代码能不能达到你的要求
输入非数字结束。
scanf("%ld%ld", &n1, &n2) !=EOF   windows是输入ctrl+z退出循环。你的printf在循环外,没输出是因为你没有退出循环。
2016-09-27 16:07
zhq123333
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-9-27
收藏
得分:0 
回复 6楼 linlulu001
不好意思,刚刚结帖的时候没有看到您的回复,您的回答给了我很大帮助,我将printf放到回圈内就有输出值了,十分感谢。

[此贴子已经被作者于2016-9-27 16:11编辑过]

2016-09-27 16:08
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 7楼 zhq123333
刚编了段看能不能满足你的要求。
#include <stdio.h>
int main()
 {
     long n1, n2, i, m, n, cnt, maxcycle, tmp;
     
     if(scanf("%ld%ld", &n1, &n2) ==2){
         if(n1>n2){
             tmp=n1;
             n1=n2;
             n2=tmp;
         }
     }
     maxcycle=1;
     for(m=n1;m<=n2;m++)  //m从n1增到n2,其实就是从n1到n2依次计算cycle lengh
     {
         n=m;         //给n初始化
         cnt=1;       //给计数初始化
         while(n != 1){
         if(n % 2)
             n=3*n+1;
         else
             n=n/2;
         cnt++;
     }
     if(cnt>maxcycle)maxcycle=cnt;
     
     }
     printf("%ld %ld %ld\n", n1, n2, maxcycle);
     return 0;
 }

[此贴子已经被作者于2016-9-27 16:34编辑过]

2016-09-27 16:17
zhq123333
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-9-27
收藏
得分:0 
回复 8楼 ehszt
太棒了!!完全符合我的要求,谢谢您。但其实我有点看不懂for回圈那一部分,请问您能帮我简单的解释一下吗??谢谢您。
2016-09-27 16:25
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
首先提供一个老帖了,很多人看过,也相信有很多新人没看过。现在推荐下说的非常好,可以看看
https://bbs.bccn.net/viewthread.php?tid=41519&extra=&page=1#
再者我说下我自己的想法,对事不对人,仅仅是个人的一点看法,有不同想法看法可以交流,但请勿喷。
    说正题:其实我自己就是一个C的爱好者,所以自己看书学学停停,水平也就很一般的,简单的问题可以提点意见或者帮助,稍微有点技术含量的,咱也有自知之明。一直也都在这个论坛里,学到了很多,也被鄙视过,总归还是要感谢帮助我的每一个人。
    对于提问的帖子,不管是论坛里的老人了还是新人了(说到这多说一句,我喜欢喊新人而不是新手),对于这个论坛而言,绝大多数都是无私的互相帮助,所以对新人来说你提问就要有一定艺术和说话的技巧:
首先最简单的就是口气,既然是求助就应该摆正身份,这个身份不是说要低声下气,卑躬屈膝,而是要谦虚的请教,不能盛气凌人一般的,认为帮助你就是理所当然的。没人回帖就觉得大家看不起你了,这个不一定,说不定大家是忙,或者是在思考如何帮助你呢?是不是多一些平和的心态,彼此更舒服一些呢。其次提问一定要说清楚自己的问题,是不会不懂不知道如何下手,还是说有代码编译出现了错误等等,有代码一定要贴出你的代码,可以的详细描述你遇到的问题,贴出你编译的错误等。不是不能贴图,可以贴你遇到的错误截图,但代码一定要能够让别人复制的,这样方便别人,更有利于别人给予你帮助。第三看到别人回帖后出于礼貌我觉得最好能够给予一定的回复,比如按照帮助的方法是不是解决问题了,也就是给一些反应,不能别人帮了你,一句回话都没是吧;最后提醒记得结贴
其他提问的艺术更详细的还请看链接的帖子。我只是简单说说自己的理解。
    说完提问,再谈下对于看帖的各位大大,互相理解下,既然是新手提问,肯定是遇到了问题和困难,能帮助的力所能及的还是可以多多伸手帮一下。如果不愿意或者有其他想法,可以看看就算了,不回帖也就是了,不建议或者说尽量不要太重的语气来回复,毕竟人家也不一定就是故意提问的那么笼统,那么不知所谓,让你不知道他要问的是什么。我自己也是一步步这样过来的,有时候是真的没注意或者没想清楚怎么描述自己的问题。有自己水平的问题,也有个人习惯的问题。或者就是想当然了,以为这么说别人会懂,但绝对不是故意装什么高深,让人莫名其妙。当然不排除有一些人提问就是让人看着不舒服,对于这样的问题,大可以不预理会嘛,没必要和他置气,气着自己别人也不知道,有句话说的好:生气就是拿别人的错误来惩罚自己。看开些,平和的心态很重要。如果别人是真的不会提问,不懂有效的提问方式,得到的是教训,他其实心里也很不是滋味的,很容易打击新人的积极性。也许你并没有看不起他的意思,但是提问的人不一定会这么想。怎么说,多换位思考,互相理解吧,其实很简单的,有时候水平不到,真的会犯非常低级的错误而不自知。就像我最近教孩子背诵乘法口诀,大人是不是觉得非常简单,是不是就能认为孩子这么简单的就不会,还背那么久还容易错?当然不是,他没学过,在他的脑子里是从无到有的概念,有些事有些问题就是一层纸的事,捅破了多简单,但是捅不破就是不懂不明白。
一句话:平和,多互相理解
可能字太多很多人不乐意看了,就当自己发发牢骚吧,^-^
收到的鲜花
  • 书生牛犊2016-09-27 17:21 送鲜花  1朵   附言:把那个帖子置顶。这段时间开学。论坛来的新 ...
2016-09-27 16:30
快速回复:关于3n+1问题,求两个数之间最大cycle length
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018452 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved