首页 > ACM题库 > 九度OJ > 九度-1031-xxx定律[解题代码]
2013
12-12

九度-1031-xxx定律[解题代码]

题目来源:2009年浙江大学计算机及软件工程研究生机试真题

题目描述:
    对于一个数n,如果是偶数,就把n砍掉一半;如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止。
    请计算需要经过几步才能将n变到1,具体可见样例。
输入:
    测试包含多个用例,每个用例包含一个整数n,当n为0 时表示输入结束。(1<=n<=10000)
输出:
    对于每组测试用例请输出一个数,表示需要经过的步数,每组输出占一行。
样例输入:
3
1
0
样例输出:
5
0

java 代码如下:
import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner s = new Scanner(new BufferedInputStream(System.in));
		while(true){
			int n = s.nextInt();
			if(n == 0 )
				break;
			int count = 0;
			while( n!= 1){
				if(n%2 == 0 )
					n = n/2;
				else
					n = (3*n+ 1)/2;
				count ++;
			}
			System.out.println(count);
		}
	}

}

/**************************************************************
	Problem: 1031
	User: coder
	Language: Java
	Result: Accepted
	Time:180 ms
	Memory:16944 kb
****************************************************************/


  1. Thanks for taking the time to examine this, I really feel strongly about it and love studying a lot more on this topic. If possible, as you acquire experience

  2. 第一句可以忽略不计了吧。从第二句开始分析,说明这个花色下的所有牌都会在其它里面出现,那么还剩下♠️和♦️。第三句,可以排除2和7,因为在两种花色里有。现在是第四句,因为♠️还剩下多个,只有是♦️B才能知道答案。

  3. int half(int *array,int len,int key)
    {
    int l=0,r=len;
    while(l<r)
    {
    int m=(l+r)>>1;
    if(key>array )l=m+1;
    else if(key<array )r=m;
    else return m;
    }
    return -1;
    }
    这种就能避免一些Bug
    l,m,r
    左边是l,m;右边就是m+1,r;