博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
694 - The Collatz Sequence
阅读量:7294 次
发布时间:2019-06-30

本文共 1222 字,大约阅读时间需要 4 分钟。

hot3.png

题意:

输入两个数 A 和 L, 按以下条件进行循环运算, 问最后结束循环时一共进行了多少次运算?
1. 若 A 为 1 或 A > L, 则退出.
2. 若 A 为偶数, 则 A = A/2.
3. 若 A 为奇数, 则 A = 3*A + 1.

思路:

题目所给思路已经很清楚了.

要点:

1. 题目虽然说明输入最大的 A 和 L 不会超出 32 bit 所能表示的最大整数(2,147,483,647), 但是在计算是, 3*A + 1 很有可能会超出这个最大的整数, 数据溢出, 导致 Time limit exceeded; 所以 A 和 L 的类型都应定义为 long.
2. 因为这里的写法是把 A==1 写到 while 判断条件里去了, 所以最后如果是在 A==1 时退出循环的, 则 terms 需要加 1.

题目:

代码:

# include 
# include
# include
using namespace std;int main(int argc, char const *argv[]){ #ifndef ONLINE_JUDGE freopen ("694_i.txt", "r", stdin); freopen ("694_o.txt", "w", stdout); #endif // 这里类型 使用 int 的话, 会报 Time limit exceeded // 因为 3*A + 1 很有可能会导致 int 溢出, 从而永远算不完 long A; long L; cin >> A >> L; int cs = 0; // case 数目 while(A > 0 && L > 0){ ++ cs; cout << "Case " << cs << ": A = " << A << ", limit = " << L << ", number of terms = "; int terms = 0; while(A != 1 && A<=L){ if(A % 2 == 0){ A = A/2; }else{ A = 3*A + 1; } ++ terms; } // 如果最后是因为 A=1 退出的, 则 terms 要加1 cout << (A==1 ? ++terms : terms) << endl; cin >> A >> L; } return 0;}

环境:C++ 4.5.3 - GNU C++ Compiler with options: -lm -lcrypt -O2 -pipe -DONLINE_JUDGE

转载于:https://my.oschina.net/zenglingfan/blog/137799

你可能感兴趣的文章
SpringCloud学习成长之路 六 cloud配置中心
查看>>
MyEclipse定位class文件
查看>>
STM32(HY-SRF05)超声波测距项目
查看>>
《practical Java》读书笔记
查看>>
数据库字段顺序的【坑】
查看>>
spring5新响应式框架-webflux实战
查看>>
软甲架构笔记 三
查看>>
STL training (uva上一些比较好的用来熟悉STL)
查看>>
[未完成]关于CSS的总结
查看>>
陈皓一起写Makefile 概述
查看>>
linux下安装启动rpc服务
查看>>
Software Testing, Lab 1
查看>>
World发布博客测试
查看>>
IIS 提高连接的并发数,和CPU的使用率。
查看>>
修改Sysvol复制方式
查看>>
python3.x中如何使用base64、base32、base16编码解码
查看>>
HDOJ 1084 排序 水
查看>>
深度拷贝一个链表
查看>>
POJ3229
查看>>
用promise封装ajax
查看>>