The Collatz Sequence |
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
经过运算后会超过int范围,因此使用long型
#include <stdio.h> long a, l; long cal(long count) { while (a != 1) { if (a % 2) a = a * 3 + 1; else a /= 2; if (a <= l) count++; else return count; } return count; } int main() { int mcase = 1; while (scanf("%ld %ld", &a, &l) != EOF && (a > 0 && l > 0)) { long count = 1; long tmp = a; printf("Case %d: A = %ld, limit = %ld, number of terms = %ld\n", mcase++, tmp, l, cal(count)); } return 0; }