Time limit: 3.000 seconds
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=94&page=show_problem&problem=635
An algorithm given by Lothar Collatz produces sequences of integers, and is described as follows:
It has been shown that this algorithm will always stop (in step 2) for initial values of A as large as 109, but some values of A encountered in the sequence may exceed the size of an integer on many computers. In this problem we want to determine the length of the sequence that includes all values produced until either the algorithm stops (in step 2), or a value larger than some specified limit would be produced (in step 4).
3 100 34 100 75 250 27 2147483647 101 304 101 303 -1 -1
Case 1: A = 3, limit = 100, number of terms = 8 Case 2: A = 34, limit = 100, number of terms = 14 Case 3: A = 75, limit = 250, number of terms = 3 Case 4: A = 27, limit = 2147483647, number of terms = 112 Case 5: A = 101, limit = 304, number of terms = 26 Case 6: A = 101, limit = 303, number of terms = 1
完整代码:
/*0.028s*/ #include<cstdio> int main(void) { int cases = 0, step; long long A, AA, lim, temp; while (true) { scanf("%lld%lld", &A, &lim); if (A < 0) break; AA = A, step = 1; while (A != 1) { temp = 3 * A + 1; if ((A & 1) == 0) A >>= 1; else if (temp > lim) break; else A = temp; step++; } printf("Case %d: A = %lld, limit = %lld, number of terms = %d\n", ++cases, AA, lim, step); } return 0; }