加载中......
输入验证码,即可复制
微信扫码下载好向圈APP, 登陆后即可进入消息页面查看验证码
只需要3秒时间
2020年12月的全国青少年软件编程考试(C语言)有一题:

题目:角谷猜想

所谓角谷猜想,是指对于任意一个正整数:如果是奇数,则乘3加1;如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。

如,假定初始整数为5,计算过程分别为16、8、4、2、1。

程序要求输入一个整数,将经过处理得到1的过程输出来。

时间限制:1000 内存限制:65536

输入:一个正整数N( N<= 2,000,000)

输出:从输入整数到1的步骤,每一步为一行,每一步中描述计算过程。最后一行输出“End”。如果输入为1,直接输出“End”。

-----------------------------------

程序逻辑比较简单,就是 循环+分支 结构。

全国青少年软件编程(C语言)程序调试一则-1.jpg

调试了几个数,没发现什么问题,int的范围是-2147483648 ~ 2147483647. 这个范围远大于题目要求的 N<=2000000。然而,最后成绩显示此题没通过。

查其原因,思路没问题,很可能 int 溢出了,但这只是猜测,需要验证,于是该代码如下:

全国青少年软件编程(C语言)程序调试一则-2.jpg

运行后发现 n = 113383时,程序会死循环。

运行结果如下:

全国青少年软件编程(C语言)程序调试一则-3.jpg

原因找到了,将n的类型定义成unsigned int或者long long均可通过。

总结:
    需要特别注意数值溢出带来的问题。经验不一定可靠,例如上面谁能想到113383这个数会引起BUG。即使能猜到会溢出,但手工输入就太困难了,可以考虑加入一些测试代码。
程序员圈
16798 查看 10 0 反对

说说我的看法高级模式

您需要登录后才可以回帖 登录|立即注册

  • 惊险的野菊花丶

    2021-2-25 14:19:02 使用道具

    来自: 北京朝阳来自: 北京朝阳来自: 北京朝阳来自: 北京朝阳
    题目上说这只是一个猜想,应该还没有被证明,否则就叫做定理了,既然是猜想,程序就应该充分考虑不成立的情况,按照您的代码,如果有一个数不满足猜想,就会陷入死循环,可以考虑定义一个最大计算步数,超过该步数则认为不成立。然后,这个是c++,不是c语言,二者差别还是比较大的,最后一个建议,除非竞赛有特别规定,平时练习最好不要把所有代码都写到main里面,模块化更好一点
  • Digitalhua

    2021-2-26 06:07:29 使用道具

    来自: 北京来自: 北京来自: 北京来自: 北京
    一般来说2字节使用short,4字节使用long,int这东西可能2字节也可能4字节,不怎么靠谱的
  • 音62

    2021-2-27 02:46:34 使用道具

    来自: 中国来自: 中国来自: 中国来自: 中国
    你的编译器是16位的吧?
  • 金洋洋7

    2021-2-28 05:07:25 使用道具

    来自: 北京来自: 北京来自: 北京来自: 北京
    这不是C++?麻烦专业一点好吗?
  • 黄喜聪

    2021-3-1 07:54:53 使用道具

    来自: 北京来自: 北京来自: 北京来自: 北京
    内存限制没用上啊,时间限制也没用上
  • 634

    2021-3-2 09:52:06 使用道具

    来自: 北京来自: 北京来自: 北京来自: 北京
    有那么一个计算,肯定有可能溢出的
  • nakatahao

    2021-3-3 01:47:28 使用道具

    来自: 湖北来自: 湖北来自: 湖北来自: 湖北
    C++啊
  • 笑笑1991shine

    2021-3-3 20:59:46 使用道具

    来自: 中国来自: 中国来自: 中国来自: 中国
    不错,好
  • al019

    2021-3-4 21:26:38 使用道具

    来自: 中国来自: 中国来自: 中国来自: 中国
    你这小学生编程,是指几岁的?一年级?五年级?
  • della886

    2021-3-5 07:57:03 使用道具

    来自: 福建来自: 福建来自: 福建来自: 福建
    还要判断输入的是不是数值,在不在限定的区间呀!