-1

Summary

Hello everyone. I am trying to solve a -relatively easy- problem, related to the Collatz Conjecture.

First and foremost, the problem reads as follows:

The following iterative sequence is defined for the set of positive integers:

n → n/2 (n is even) n → 3n + 1 (n is odd)

Using the rule above and starting with 13, we generate the following sequence:

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains >10 terms. Although it has not been proved yet (Collatz Problem), it is thought >that all starting numbers finish at 1.

Which starting number, under one million, produces the longest chain?

NOTE: Once the chain starts the terms are allowed to go above one million.

Source: https://projecteuler.net/problem=14

A short footnote

Initially, I did have problems with my variables overflowing and becoming negative. Although, I fixed that by using unsigned long long, as I mentioned.

Code

#include <iostream>
using namespace std;

int collatz(long long n) {
 if (n%2 == 0) return n/2;
 return 3*n+1;
}

int main() {
    unsigned long long cnt, n, maxcnt=0, num;
    for(int i=1; i<1000000; i++) {
        cnt=1;
        n=i;
        while(n != 1) {
            n=collatz(n);
            cnt++;
        }
        if(cnt>maxcnt) {
            maxcnt=cnt;
            num=i;
        }
    }
    cout<<num;
    return 0;
}

Result

Instead of getting any result, it just ends up in an infinite loop.

ripeat
  • 9
  • 5
  • Debuggers are generally really good at helping figure out infinite loops. Run the program, wait for it to get trapped in the loop, pause the program and see where you are. Step around the loop to see why the program won't exit it. Once you know why it's happening, you can usually figure out a few tests to see how it got in that state. – user4581301 Feb 18 '19 at 22:35
  • A 16 bit int will always be < 1000000. What is max int in your environment? – Yunnosch Feb 18 '19 at 22:35
  • @Yunnosch How can I check the int limit in my environment? – ripeat Feb 18 '19 at 22:40
  • [Know your ``](https://en.cppreference.com/w/cpp/types/numeric_limits) – user4581301 Feb 18 '19 at 22:42
  • @Yunnosch [These are my limits.](https://gyazo.com/4dc48bf09840e4ea94cd440276c66437) – ripeat Feb 18 '19 at 22:47
  • 2
    After you fix your bug, if you are still too slow I have one major hint: [memoization](https://en.wikipedia.org/wiki/Memoization). You should be able to solve this problem in a fraction of a second. – Blastfurnace Feb 18 '19 at 22:51

1 Answers1

0

well if your function returns an int you didn't really fix the problem just part of it,I suppose this should do

unsigned long long collatz(unsigned long long n)
Spinkoo
  • 2,080
  • 1
  • 7
  • 23