3n + 1 решение дает неправильный ответ

Это мое решение проблемы 3n + 1, которая дает неправильный ответ. За последние 5 дней я много раз боролся за это. Пожалуйста, помогите мне разобраться в проблеме в моем решении. Я использовал хвостовую рекурсию и также храню карту для отслеживания степеней 2, чтобы быстрее найти ответ.
Ссылка на проблему Проблемы программирования — проблема 3n + 1

#include <stdio.h>
#include <map>
using namespace std;

#define MAX 1000000
typedef long long int ll;
map<int, int> globalMap;

void process(){
ll i = 1, key = 1, value = 1;
while(value < MAX){
globalMap[value] = key;
key++; value *= 2;
}
return;
}

ll cycleLength(ll n, ll ans){
if(n == 1) return ans;
if(globalMap.find(n) != globalMap.end()) return ans+globalMap[n];
else{
if(n%2){
return cycleLength(3*n+1, ++ans);
}
else return cycleLength(n/2, ++ans);
}
}
int main(){
ll i, j, temp, max=-1;
process();
while(scanf("%lld%lld", &i, &j) != EOF){
max = -1;
for(ll a = i; a <= j; ++a){
temp = cycleLength(a, 0);
if(max < temp) max = temp;
}
printf("%lld %lld %lld\n", i, j, max);
}
return 0;
}

-2

Решение

Ваш process() функция будет заполняться globalmap такой, что длина цикла 1 равна 1, но ваш cyclelength функция возвращает длину цикла 0, если передана в ll = 1 а также ans = 0,

Итак, на следующем входе:

1 1

1 2

Ваша программа выведет:

1 1 0
1 2 2

Кажется, что это может быть камнем преткновения с твоим солнцем.

2

Другие решения

Ваше решение не будет работать, если я> J.

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

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

1

По вопросам рекламы [email protected]