33,008
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#define MAX 1000000
static int cache[MAX] = {0};
long long next(long long n){
if(n & 1)
return n + (n << 1)+1;
else
return (n >> 1);
}
int cl(long long n){
int l;
if(n == 1)
return 1;
if(n < MAX && cache[(int)n] != 0)
return cache[(int)n];
l = cl(next(n))+1;
if(n < MAX)
cache[(int)n] = l;
return l;
}
int main(){
int start,end,i,r,max,tmp,s,e;
printf("Input start&end:\n");
while(scanf("%d%d",&start,&end)){
s = start;
e = end;
if(start > end){
tmp = start;
start = end;
end = tmp;
}
max = 0; /*critical*/
for(i = start; i <= end; ++i){
r = cl(i);
if(max < r)
max = r;
}
printf("%d %d %d\n",s,e,max);
}
}
import java.util.*;
import java.math.*;
import java.io.*;
public class Main {
// cache for already computed cycle lengths
public static int[] cache = new int[1000000];
// a function that returns the
// next number in the sequence
public static long next(long n) {
if (n % 2 == 0)
return n / 2; // if n is even
else
return 3 * n + 1; // if n is odd
}
public static int cycleLength(long n) {
// our base case
// 1 has a cycle length of 1
if (n == 1)
return 1;
// check if we've already cached the
// cycle length of the current number
if (n < 1000000 && cache[(int)n] != 0)
return cache[(int)n];
// the cycle length of the current number is 1 greater
// than the cycle length of the next number
int length = 1 + cycleLength(next(n));
// we cache the result if the
// current number is not too big
if (n < 1000000)
cache[(int)n] = length;
return length;
}
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
PrintWriter out = new PrintWriter(System.out, true);
// while there is some input to read
while (in.hasNextInt()) {
int i = in.nextInt(),
j = in.nextInt(),
from = Math.min(i, j),
to = Math.max(i, j),
max = 0;
// loop through all the numbers
// and find the biggest cycle
for (int n = from; n <= to; n++) {
max = Math.max(max, cycleLength(n));
}
out.printf("%d %d %d\n", i, j, max);
}
}
}