不同语言中相同算法的不同输出

时间:2011-04-29 16:44:34

标签: java c algorithm

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 ...为什么??

3 个答案:

答案 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位。