uva: 3n + 1 == runtime, runtime....RUNTIME!

Jan 2, 2014 at 1:37pm
hello there. i've trying to solve a problem in uva but for some reason its always runtime, runtime, and runtime. i've check using the inputs given and they were right but when i submitted it: runtime! it's already my six-ed try anduva doesn't really give a reason why its a runtime so pls help me! i don't know what to do! >.<

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=36

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
double i, j;
int x, ioriginal, imax, temp;
vector<int>v;

while(cin>>i>>j && (i < 1000000 && j < 1000000)){

    i = int(i);

    j = int(j);

    if(i > j)
    {
        temp = j;
        j = i;
        i = temp;
    }

    ioriginal = i;

    while(i != j)
    {

    int ctr = 1;

    x = i;

        while(x != 1)
        {
            if(x%2 == 0)
                x = x/2;
            else
                x = 3*x + 1;
        ctr++;
        }

    v.push_back(ctr);

    i++;

    }

imax = *max_element(v.begin(), v.end());

cout<<ioriginal<<" "<<j<<" "<<imax<<endl;

v.clear();

}

return 0;

}
Last edited on Jan 2, 2014 at 2:06pm
Jan 2, 2014 at 3:46pm
Could clarify the question please.

What input data is used and what output do you get? Are there any error messages, if so please give the actual error message.

Edit: The key may be in attention to detail.
The two integers must be output in the same order as they were input. Also what happens if the two input integers are the same?

As for your code, the use of <vector> and <algorithm> here is overkill in my opinion, its more straightforward to simply keep track of the highest value of ctr instead of pushing it into the vector. I don't think type double is required as all values are integers here.
Last edited on Jan 2, 2014 at 5:05pm
Jan 2, 2014 at 5:19pm
Don't know if this will help but here are some points:

If i == j on your first run, you have an empty vector and v.end() is returned. Since this points past the end of your vector, you'll likely to get a segmentation fault.

Calling vector::clear() doesn't guarantee reallocation or change in capacity, so if it's not your first run, and i == j, you may end up with the previous result rather than a crash. This is even worse.

Finally, consider that if your values are negative, then your inner while loop will never terminate!
Jan 3, 2014 at 12:21am
o.k i've changed the code into a simpler form and now it's a "wrong answer". I don't think there's anything wrong with it (since i checked the inputs and outputs using a different code that got accepted).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
using namespace std;

int oddEven(int x)
{
int ctr = 1;

    while(x != 1)
    {
        if(x%2 == 0)
            x = x/2;
        else
            x = 3*x + 1;
    ctr++;
    }

return ctr;
}

int main()
{
int i, j, x, iOriginal, jOriginal, ctr, temp = 0;

while(cin>>i>>j)
{
int temp = 0;

    iOriginal = i;
    jOriginal = j;

    if(i > j)
        swap(i, j);


    if(i == j)
        temp = oddEven(i);

    while(i != j)
    {
        x = i;
        ctr = oddEven(x);
        if(ctr > temp)
            temp = ctr;
        i++;
    }

    i = iOriginal;
    j = jOriginal;

cout<<i<<" "<<j<<" "<<temp<<endl;
}

}
Jan 3, 2014 at 12:53am
learn to indent.

determine the maximum cycle length over all integers between and including i and j.

You fail for input: 1 2
Jan 3, 2014 at 1:21am
i've changed the "while(i != j)" part to "while(i != j + 1)". does that help?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
using namespace std;

int oddEven(int x)
{
int ctr = 1;

    while(x != 1)
    {
        if(x%2 == 0)
            x = x/2;
        else
            x = 3*x + 1;
    ctr++;
    }

return ctr;
}

int main()
{
int i, j, x, iOriginal, jOriginal, ctr, temp = 0;

while(cin>>i>>j)
{
    int temp = 0;

        iOriginal = i;
        jOriginal = j;

        if(i > j)
            swap(i, j);


        if(i == j)
            temp = oddEven(i);

        while(i != j + 1) /// from "i != j" to "i != j + 1"
        {
            x = i;
            ctr = oddEven(x);
            if(ctr > temp)
                temp = ctr;
            i++;
        }

        i = iOriginal;
        j = jOriginal;

    cout<<i<<" "<<j<<" "<<temp<<endl;
}

}


finally got accepted for the 11th time! thnks for the help guys! :D
Last edited on Jan 3, 2014 at 1:30am
Jan 3, 2014 at 3:28am
Looks like this is done now. I would have suggested while (i <= j) as slightly simpler than while(i != j + 1).
Topic archived. No new replies allowed.