本文共 960 字,大约阅读时间需要 3 分钟。
任意给定一个正整数N,
如果是偶数,执行: N / 2 如果是奇数,执行: N * 3 + 1生成的新的数字再执行同样的动作,循环往复。
通过观察发现,这个数字会一会儿上升到很高,
一会儿又降落下来。 就这样起起落落的,但最终必会落到“1” 这有点像小冰雹粒子在冰雹云中翻滚增长的样子。比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1 可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。输入格式:
一个正整数N(N<1000000) 输出格式: 一个正整数,表示不大于N的数字,经过冰雹数变换过程中,最高冲到了多少。例如,输入:
10 程序应该输出: 52再例如,输入:
100 程序应该输出: 9232资源约定:
峰值内存消耗 < 256M CPU消耗 < 1000ms
#includeusing namespace std;int main(){ int N; cin >> N; int max = 0; //存储冲到的最高数 for (int i = 1; i <= N; ++i) { int temp = i; //临时存储i的值 //防止N == 1的情况 if (i & 1) //N是奇数 { i = i * 3 + 1; } else { i = i / 2; } if (max < i) { max = i; } while (i != 1) { if (i & 1) //N是奇数 { i = i * 3 + 1; } else { i = i / 2; } if (max < i) { max = i; } } i = temp; } cout << max << endl; return 0;}
中间还有很多坑:
所以总结一下,遇到这种看起来表面很简单的题,做出来却不对。首先检查题意字眼,接着Debug看看是否是遗漏了。
转载地址:http://avtai.baihongyu.com/