【手把手带你刷好题】——23.害死人不偿命的(3n+1)猜想(简单模拟、非力扣)

举报
安然无虞 发表于 2022/05/26 23:36:45 2022/05/26
【摘要】 【前言】 今天是刷题打卡第23天! 生命不息,刷题不止,冲鸭!! 原题:害死人不偿命的(3n+1)猜想(简单模拟) 题目描述: 卡拉兹猜想: 对任意一个自然数n ,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n = 1 。卡拉兹在1...

【前言】

今天是刷题打卡第23天!

生命不息,刷题不止,冲鸭!!

原题:害死人不偿命的(3n+1)猜想(简单模拟)

题目描述:

卡拉兹猜想:

对任意一个自然数n ,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n = 1 。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,平明想证明这个貌似很荒唐......

此处并非要证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n, 简单的数一下需要多少步才能得到 n = 1?这里就拿n = 1000举例。

用代码解决就非常简单啦,看下面的思路。

思路:

读入题目给出的n, 之后用while循环语句反复判断n 是否为1:

  • 如果 n == 1,则退出循环;
  • 如果 n != 1,则判断n 是否为偶数,如果是偶数,则令n 除以2;否则令n 为(3*n+1)/ 2 。之后令计数器step++;

这样退出循环后,step的值就是需要的答案。

代码执行:


  
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int step = 0;
  5. int n = 1000;
  6. while (n != 1)
  7. {
  8. if (n % 2 == 0)
  9. {
  10. n /= 2;
  11. }
  12. else
  13. {
  14. n = (3 * n + 1) / 2;
  15. }
  16. step++;
  17. }
  18. printf("%d\n", step);//输出72
  19. return 0;
  20. }

这就是简单模拟题,没有涉及算法,完全只是根据题目描述来进行代码的编写,所以侧重考查的是代码能力,我们在做这种类型题目的时候一定要认真读题!读题!!题!!!对于模拟题,“题目怎么说,你就怎么做”

结语

今天是刷题打卡第23天!

因为笔者近期正准备蓝桥杯的一些基础算法,有些题目来源并非力扣,在标题处也会有所说明,铁汁们请放心哦,补充进来的题目都是很不错的。

 

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121458400

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。