C语言每日小练(一)——3n+1问题
来源:互联网 发布:成都理工大学网络教育 编辑:程序博客网 时间:2024/05/18 13:23
例:3n+1问题
对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半。经过若干次变换,一定会使n变为1。例如3-》10-》5-》16-》8-》4-》2-》1。
输入n,输出变换的次数。n不大于10的九次幂。
样例输入:3
样例输出:7
解:直接模拟过程即可,下面是代码:
#include<stdio.h>int main(){ int n, count = 0; scanf("%d", &n); while(n > 1) { if(n%2 == 1) n = n * 3 + 1; else n /= 2; count++; } printf("%d\n", count); return 0;}验证上面样例,发现正确:
那如果输入的是999999999呢?结果:
居然是1!原来是因为定义的n为int型整数,它的最大值为2147483647,也就是说,在程序刚刚执行了一次“n = 3*n+1”时,就已经溢出了,所以直接输出了1~所以只好用64位长整型了,程序如下:
#include<stdio.h>int main(){ int count = 0; long long n;//定义64位长整型数 scanf("%lld", &n);//此处"%lld"也可写成"%I64d" while(n > 1) { if(n%2 == 1) n = n * 3 + 1; else n /= 2; count++; } printf("%d\n", count); return 0;}下面看运行结果:
程序正常运行~
总结:在编写程序时,要注意定义的变量溢出的问题,否则很可能纠结于程序的逻辑正确与否上却发现怎么也找不出Bug,纠结啊...
3 0
- C语言每日小练(一)——3n+1问题
- C语言每日小练(一)——n!问题
- C语言每日小练(一)——7744问题
- C语言每日小练(二)——开灯问题
- C语言每日小练(三)——abc排列问题
- C语言每日小练(三)——竖式问题
- C语言每日小练(二)——蛇形填数
- C语言每日小练(四)——勇者斗恶龙
- C/C++每日小练(八)——蚂蚁
- c语言每日一练5
- c语言每日一练6
- c语言每日一练7
- 【20170924】C语言每日一练
- 【20170926】C语言每日一练
- 【20170927】C语言每日一练
- 【20170928】C语言每日一练
- 【20170929】C语言每日一练
- 【20171009】C语言每日一练
- 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
- XP停摆让中国2亿PC“裸奔”
- 广告:飞机突降四川北川马路上:“空中悍马”试飞
- IOS开发判断在字符串中是否包含相应的字符
- TeamViewer(TV)锁屏后黑屏无法远程的解决方法
- C语言每日小练(一)——3n+1问题
- 鼠标悬浮注释
- svn命令总结
- poj2148(二维背包)
- 烟花易冷,人事易分
- 顺序表 C++模板实现
- 《Ext JS 4.2实战》目录
- 一个和spring整合的依赖注入的servlet,子类可自动装配依赖Bean
- VC++中数值与字符串相互转化(总结)