声明
可能本文章会有错误, 希望各位读者看到后, 记得回复留言, 提醒我, 以免误人子弟. 本人菜鸡, 还望各位大佬手下留情.
题目:
冰雹数
任意给定一个正整数 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
请严格按要求输出, 不要画蛇添足地打印类似:"请您输入..." 的多余内容.
所有代码放在同一个源文件中, 调试通过后, 拷贝提交该源码.
注意: 不要使用 package 语句. 不要使用 jdk1.7 及以上版本的特性.
注意: 主类的名字必须是: Main, 否则按无效代码处理.
---
分析:
这个题逻辑很简单, 只不过有点小坑的地方, 冲到最高的冰雹数是指从 1(其实可以从 2 开始, 因为冰雹数到了 1 就停止循环了) 到 N, 不然一直算不出来 (表示被坑的很惨),cpu 消耗时间其实不用太在意, 目前我这种初级菜鸟写的代码还有查出过时间的...
代码
- import java.util.Scanner;
- public class lq08 {
- public static int fun(int N) {
- // 当前冰雹数冲到的最高数
- int f_max = 1;
- while(N != 1) {
- if(N%2 == 0) {
- N = N/2;
- }else {
- N = N*3+1;
- }
- if(N>f_max)
- f_max = N;
- }
- return f_max;
- }
- public static void main(String[] args) {
- int max = 1;// 从 1 到 N 的冰雹数冲到最高的数
- int f_max;// 当前冰雹数冲到的最高数
- Scanner sc = new Scanner(System.in);
- int N = sc.nextInt();
- // 开始时间
- long start = System.currentTimeMillis();
- // 循环出从 1 到 N 的数
- for(int i=1;i<=N;i++) {
- f_max = fun(i);
- if(f_max> max)
- max = f_max;
- }
- System.out.println(max);
- // 结束时间
- long end = System.currentTimeMillis();
- // 时间, 比赛的时候不建议写这个浪费时间, 当然你是大神的话, 随意, 当然是大神的话也不太可能来看我的文章, 哈哈哈
- System.out.println("时间:" + (end-start));
- }
- }
8. 冰雹数
来源: http://www.bubuko.com/infodetail-2556466.html