UVa 100-The 3n + 1 problem

问题描述】

Problems in Computer Science are often classified as belonging to a certain class of problems (e.g., NP, Unsolvable, Recursive). In this problem you will be analyzing a property of an algorithm whose classification is not known for all possible inputs.
    计算机科学中的问题常常用确定性来进行分类,(比如NP,无解,递归)。在这个问题中,你需要分析一个算法的性质,这个算法的分类对于全部可能的输入而言是未知的。

Consider the following algorithm:
    考虑下面的算法:

input n
print n
if n = 1 then stop
    if n is odd then n <- 3n + 1
    else n <- n / 2
goto 2

    Given the input 22, the following sequence of numbers will be printed 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1.
    给定输入22,接下来会打印出的的数列是:22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1。

    Given an input n, it is possible to determine the number of numbers printed (including the 1). For a given n this is called the cycle-length of n. In the example above, the cycle length of 22 is 16.
    对于给定的一个输入n,算法能够打印出数字(包括1)的数量是可以确定的。对于给定的n,这个数量称作n的“周期长度”。在上面的例子中,22的周期长度为16。

    For any two numbers i and j you are to determine the maximum cycle length over all numbers between i and j.
    给定任意的两个数i和j,你要确定在[i, j]的范围内的所有数中,最长的周期长度是多少。

Input 

    The input will consist of a series of pairs of integers i and j, one pair of integers per line. All integers will be less than 1,000,000 and greater than 0.
    输入一系列的整数对i和j,每一对整除独占一行。所有整除都小于1,000,000且大于0。

    You should process all pairs of integers and for each pair determine the maximum cycle length over all integers between and including i and j.
    你要处理所有的整除对,并确定每对整除所限定范围内(含)的所有整数的最大周期长度。

    You can assume that no operation overflows a 32-bit integer.
    你可以假设不计算中不会出现32位整数的溢出错误。

Output 

For each pair of input integers i and j you should output i, j, and the maximum cycle length for integers between and including i and j. These three numbers should be separated by at least one space with all three numbers on one line and with one line of output for each line of input. The integers i and j must appear in the output in the same order in which they appeared in the input and should be followed by the maximum cycle length (on the same line).
    对输入的每一对i和j应该输出i、j和[i, j]范围内的最大周期长度。这3个数字之间各由至少1个空格隔开,并在每一行输入之后,将这3个输全部输出在下一行内。输出整数i和j时必须按照他们在输入时的顺序输入,后面跟着输出最大周期长度(在同一行)。

Sample Input 

1 10
100 200
201 210
900 1000

Sample Output 

1 10 20
100 200 125
201 210 89
900 1000 174



【解题思路

    非常简单的起点题,算法题目中已经给出。注意测试数据中的i, j可能大小顺序相反,但输出时还要按原顺序输出,因此应另设变量存储原先的值,不可将原值丢失。


【具体实现

#include<iostream>

using namespace std;

int Times(int t){
	int times = 1;
	while (t != 1){
		t = (t % 2 == 0) ? (t / 2) : (3 * t + 1);
		++times;	
	}

	return times;
}

int main(){
	int numA, numB;
	while (cin >> numA >> numB){
		int maxAtoB = 1;
		int ansA = numA, ansB = numB;

		if (numA > numB)
			swap(numA, numB);

		for (int t = numA; t <= numB; ++t){
			if (maxAtoB < Times(t))
				maxAtoB = Times(t);
		}

		cout << ansA << ' ' << ansB << ' ' << maxAtoB << endl;
	}

	return 0;
}


【额外补充

   注意边界。



你可能感兴趣的:(UVa 100-The 3n + 1 problem)