Разные выводы для одного и того же алгоритма на разных языках - PullRequest
2 голосов
/ 29 апреля 2011

Исходный код 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;
    }

Нет логического различия между этими 2 кодами для алгоритма задачи 3n + 1. Проблема только вC это дает 476 как максимальное число циклов, где, как в Java, это 525 ... почему ??

Ответы [ 3 ]

5 голосов
/ 29 апреля 2011

В большинстве компиляторов C long обычно определяется как 4-байтовое целое число (сокращение от long int).В Java long определяется как 8-байтовое целое число.

Вы можете изменить свой код Java, чтобы использовать int для 4-байтового целого числа, или использовать long long в вашей программе на c для8-байтовое целое число (я думаю, что это было добавлено в C99, оно может или не может быть доступно на вашем компиляторе).

1 голос
/ 29 апреля 2011

Java определяет размер и представление целочисленных типов, C - нет.В Java long - это 64-битный номер дополнения до 2.В Си это не менее 32 бит, возможно больше, и может быть подписано, без знака, дополнением 1, дополнением 2, знаком и величиной или другим.

Вы заметили, что если вы измените эту строку вашегоJava-код

long n = i;

к этому

int n = (int)i;

Что вы получите тот же результат, что и ваш C-код?Вероятно, вы находитесь на компьютере с дополнением 2, и ваш компилятор C решил, что long s - это 32 бита.

1 голос
/ 29 апреля 2011

В Java коде, в методе max_cycle(long j,long k), max инициализируется в -1 , где, как в C коде, это 1 .Просто проверьте, не вызывает ли это логическую ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...