3n+1 мкА дает WA

Мой первоначальный вопрос был немного расплывчатым, так что вот отредактированный вопрос.

Задача 3n+1 uVa основана на гипотезе Коллатца. Рассмотрим любое положительное целое число "n". Если он четный, разделите его на 2. Если он нечетный, умножьте его на 3 и добавьте 1. После 'x' таких повторных операций вы получите 1. Это было доказано для очень больших чисел суперкомпьютерами.

UVa Online Judge - это онлайновый автоматизированный судья по проблемам программирования, организованный Университетом Вальядолида.

Вот ссылка на постановку задачи: uVa 3n + 1

Пожалуйста, прочтите формулировку проблемы, прежде чем смотреть на мой код! Онлайн-судья uVa проверяет ваш код на определенных тестовых случаях и сообщает вам, было ли ваше решение правильным или неправильным. Это не говорит вам, почему это не удалось (если ваше решение было неверным).

Вот ссылка снова, если вы пропустили первый: Ссылка на описание проблемы

Я не понимаю, что я пропускаю или пропускаю (так как получаю неправильный ответ) в моей логике кода. Я перепробовал множество тестовых случаев, и они, кажется, работают нормально. Я знаю, что логика может быть сжата в значительной степени, но мне просто нужно выяснить, где сейчас изъян.

Вот мой код Я знаю, что биты /stdC++ не должны использоваться, но в настоящее время это не влияет на мой код. Пожалуйста, просмотрите его, если можете, и помогите мне.

#include<iostream>
#include<cstdlib>
#include<bits/stdc++.h>
using namespace std;

int main()
{
unsigned long int num;
int i,j,tempi, tempj,temp;

//Scanning until inputs don't stop
while(scanf("%d %d",&i,&j)!=EOF)
{
//Boolean variable to set if i is greater
bool iwasmore=false;
//Boolean variable for equal numbers
bool equalnums=false;
int cycles=1, maxcycles=0;

if(i>j)
{
//swapping for the for loop to follow
temp=i; i=j; j=temp;
iwasmore=true;
}

if(i==j)
{
    equalnums=true;
}

tempi=i; tempj=j;   

//Taking each number in the given range and running it in the algorithm.
//The maxcycles variable will have the value of the maximum number of cycles
//that one of the numbers in the range took (at the end of the for loop).
for(num=i;num<=j;num=(++tempi))
{
if(cycles>maxcycles)
{
    maxcycles=cycles;
}
cycles=1;
//The actual algorithm
while(num!=1)
    {
        if(num%2==1)
        {
        num = (3*num)+1;
        cycles++;
        }

        else
        {
        num=(num/2);
        cycles++;
        }
    }

    if(equalnums==true)
        {
            maxcycles=cycles;
            equalnums=false;
        }
//Resetting num
    num=0;
}
if(!iwasmore)
cout<<i<<" "<<j<<" "<<maxcycles<<endl;
else
cout<<j<<" "<<i<<" "<<maxcycles<<endl;
}
return 0;
}

Вот вывод, который я получаю для следующего ввода:

Входные данные :

1 1

10 1

210 201

113383 113383

999999 1

Выход:

1 1 1

10 1 20

210 201 89

113383 113383 248

999999 1 525

Еще один тестовый пример:

Входные данные :

1 5

10 8

210 202

113383 113383

999999 999989

Выход:

1 5 8

10 8 20

210 202 89

113383 113383 248

999999 999989 259

1 ответ

Решение

Длина цикла последнего проверенного числа никогда не сравнивается с максимальной.

Для ввода:

8 9
9 9

Программа выводит

8 9 4
9 9 20

Но правильный ответ

8 9 20
9 9 20

Положил

if (cycles > maxcycles) {
    maxcycles = cycles;
}

в конце цикла for, а не в начале.

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