Java源代码:
package n1_problem;
/**
*
* @author nAwS
*/
public class loop {
int loop(long i)
{
long n=i;
int count=1;
while(n>1){
if(n%2==0){
n=n/2;
}
else{
n=3*n+1;
}
count++;
}
return count;
}
int max_cycle(long j,long k){
int max=-1;
for(long i=j;i<=k;i++){
int count=loop(i);
if(count>max){
max=count;
}
}
return max;
}
}
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
loop lp=new loop();
System.out.println("Max Cycle:"+lp.max_cycle(1,1000000));
}
}
C源代码:
int main()
{
long r,h;
int f=0;
do
{
printf("Value,r:");
scanf("%ld",&r);
printf("Value,h:");
scanf("%ld",&h);
f=max_cycle(r,h);
printf("Max:%d\n",f);
}while(getch()!='e');
}
int loop(long i)
{
long n=i;
int count=1;
while(n>1)
{
if(n%2==0){
n=n/2;
}
else{
n=3*n+1;
}
count++;
}
return count;
}
int max_cycle(long j,long k)
{
int max=1;
long i=0;
for(i=j;i<=k;i++){
int count=loop(i);
if(count>max){
max=count;
}
}
return max;
}
3n + 1问题算法的这2个代码之间没有逻辑上的区别。只有C的问题是它给出476作为最大循环数,而在java中它是525 ...为什么??
答案 0 :(得分:5)
在大多数C编译器中,long
通常定义为4字节整数(long int
的缩写)。在Java中,long
被定义为8字节整数。
您可以将Java代码更改为使用int
获取4字节整数,或者在c程序中使用long long
获取8字节整数(我认为这是在C99中添加的,它您的编译器可能有也可能没有。)
答案 1 :(得分:1)
在Java
代码中,在方法max_cycle(long j,long k)
中,最大初始化为 -1 ,而在C
代码中,它是的 1 即可。只需检查,如果这是导致逻辑错误。
答案 2 :(得分:1)
Java定义整数类型的大小和表示,C不定义。在Java中,long
是64位2的补码数。在C中,它至少是32位,可能更多,可以是有符号,无符号,1的补码,2的补码,符号和幅度,或其他。
您是否注意到如果更改了Java代码的这一行
long n = i;
到这个
int n = (int)i;
您获得与C代码相同的结果?可能你是2的补码机器,而你的C编译器认为long
是32位。