uva 3n+1 问题

wangmm2008 2014-07-02 06:00:45
参考一博客中的java写的解决方法,我用C写了一个,但是Java的能通过,C的超时,不知道哪里有问题
#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);
}
}
}
...全文
166 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2014-07-07
  • 打赏
  • 举报
回复
while(scanf("%d%d",&start,&end) == 2) 另外不要输出 printf("Input start&end:\n"); 这种多余的东西
wangmm2008 2014-07-02
  • 打赏
  • 举报
回复
引用 1 楼 u013697891 的回复:
会不会是数组太大了
应该不是这个原因,java代码中也有那个大数组,但是java的过了
没事人 2014-07-02
  • 打赏
  • 举报
回复
会不会是数组太大了

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧