Генерация случайного вывода 3n+1 пблм

Я пытался решить вопрос 3n+1 в java. Однако мой вывод кажется очень случайным. Вопрос в том, рассмотрим следующий алгоритм:

    1.       input n
    2.       print n
    3.       if n = 1 then STOP
    4.       if n is odd then  tex2html_wrap_inline44 
    5.       else  tex2html_wrap_inline46 
    6.       GOTO 2

Учитывая ввод 22, будет напечатана следующая последовательность чисел 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

Предполагается, что приведенный выше алгоритм прекратит работу (когда печатается 1) для любого интегрального входного значения. Несмотря на простоту алгоритма, неизвестно, верна ли эта гипотеза. Это было проверено, однако, для всех целых чисел n, таких, что 0

Учитывая ввод n, можно определить количество напечатанных чисел (включая 1). Для данного n это называется длиной цикла n. В приведенном выше примере длина цикла 22 равна 16.

Для любых двух чисел i и j вы должны определить максимальную длину цикла по всем числам между i и j.

Вход

Входные данные будут состоять из серии пар целых чисел i и j, по одной паре целых чисел на строку. Все целые числа будут меньше 1 000 000 и больше 0.

Вы должны обработать все пары целых чисел и для каждой пары определить максимальную длину цикла по всем целым числам между, включая i и j.

Можно предположить, что ни одна операция не переполняет 32-разрядное целое число.

Выход

Для каждой пары входных целых чисел i и j вы должны вывести i, j и максимальную длину цикла для целых чисел между i и j включительно. Эти три числа должны быть разделены как минимум одним пробелом со всеми тремя числами в одной строке и с одной строкой вывода для каждой строки ввода. Целые числа i и j должны появляться в выходных данных в том же порядке, в котором они появились на входных данных, и за ними должна следовать максимальная длина цикла (в той же строке). Мой код как указано ниже

class CC
 {
  int c,f,l,m;
  int returnCount(int i,int j)
   {
    f=0;
    for(int k=i;k<=j;k++)
     { 
       l=k;
       c=0;
       while(l>1)
        {
            if(l%2==0)
                {
                    l=l/2;
                    c++;
                }        
            else
                {
                    l=3*l+1;
                    c++;
                }

        }
       if(f<c)
        f=++c;
     }
     return f;
     }
public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
int i,j;    
    CC obj=new CC();
  while(sc.hasNextInt())
   { 
        i=sc.nextInt();
        j=sc.nextInt();
        System.out.println(i+" "+j+" "+obj.returnCount(i,j));
}}}

Теперь мой вклад

605293 606510
956739 956006
826611 825983
756134 756776
478642 479101
815892 815933
719220 719135
929349 929040

И ожидаемый результат

605293 606510 341
956739 956006 352
826611 825983 313
756134 756776 362
478642 479101 338
815892 815933 269
719220 719135 274
929349 929040 339

Однако мой вывод

605293 606510 341
956739 956006 0
826611 825983 0
756134 756776 362
478642 479101 338
815892 815933 269
719220 719135 0
929349 929040 0

Пожалуйста, помогите мне найти ошибку

1 ответ

Решение

Проблема в том, что у вас в первой строке первое число меньше второго, но во второй строке первое число больше второго. Вы должны поменять номера или узнать более крупный заранее:

import java.util.Scanner;

public class CC {

    int c, f, l, m;

    int returnCount(int i, int j) {
        int smaller = Math.min(i, j);
        int bigger = Math.max(i, j);

        f = 0;
        for (int k = smaller; k <= bigger; k++) {
            l = k;
            c = 0;
            while (l > 1) {
                if (l % 2 == 0) {
                    l = l / 2;
                    c++;
                } else {
                    l = 3 * l + 1;
                    c++;
                }

            }
            if (f < c)
                f = ++c;
        }
        return f;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int i, j;
        CC obj = new CC();
        while (sc.hasNextInt()) {
            i = sc.nextInt();
            j = sc.nextInt();
            System.out.println(i + " " + j + " " + obj.returnCount(i, j));
        }
    }

}

Вход и выход выглядят так:

956739
956006
956739 956006 352
Другие вопросы по тегам