이것은 잘못된 대답을하는 3n + 1 문제에 대한 나의 해결책입니다. 나는이 5 일 동안 지난 5 일 동안 여러 번 힘들었습니다. 내 솔루션에서 문제를 찾아 내도록 도와주세요. 꼬리 재귀를 사용하고지도를 저장하여 2의 능력을 추적하여 답변에 빨리 도달하도록했습니다. 문제에 대한 링크는 Programming Challenges - The 3n + 1 problem3n + 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;
}
문제와 관련이 없지만 코드에 몇 가지 다른 문제가 있습니다. 예를 들어 ['scanf'] (http://en.cppreference.com/w/cpp/io/c/fscanf)를 사용하면 입력이 정확하지 않으면 문제가 발생할 수 있습니다. 이상하게 보이는 또 다른 이유는 C++ 프로그램에서'scanf'와'printf'를 사용하는 이유입니다. –
입력 내용, 예상 출력은 무엇인지, 실제 출력은 무엇인지, 이전 출력은 아직 명확하지 않은 경우 무엇이 잘못되었는지를 지정하십시오. –
문제에 관해서는 디버거의 코드를 단계별로 시도해 보셨습니까? 문제를 찾거나 적어도 특정 코드로 범위를 좁히는 데 도움이 될 수 있습니다. 또한 일부 샘플 입력의 경우 * expected * 및 * actual * 출력은 무엇입니까? –