Don Larynx
Don Larynx

Reputation: 695

Why does my code perform the later cout first?

The following code

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>

using namespace std;

bool checkPerm(unsigned long long x){
    vector<unsigned long long> tester;
    string strx = to_string(x);
    int sizestrx = strx.size();
    int counter = 1;
    cout << "x is " << strx << " and its permutations are ";
    while (next_permutation(strx.begin(), strx.end())){
        cout << strx << " ";
        unsigned long long stoipermstrx = stoi(strx);
        tester.push_back(stoipermstrx);
    }
    cout << endl;
    int sizetester = tester.size();
    for (int j = 2; j <= 6; j++){
        cout << "j is " << j << ' ';
        for (int k = 0; k < sizetester; k++){
            if (j*x == tester[k]){
                cout << "counter increased because x, counter " << x << " " << counter << endl;
                counter++;
                if (counter == 6){
                    cout << "Number is " << x << endl;
                    return true;
                }
                break;
            }
        }
        //cout << "Number " << x << " failed" << endl;
        return false;
    }
    return true;
}

int main(){
    unsigned long long x = 1;
    for (double i = 0; ; i++){
        cout << i << endl;
        while (x < 1.67*pow(10, i)){
            if (i == 5)
                cout << x << endl;
            if (checkPerm(x)){
                cin.get();
            }
            x++;
        }
        x = pow(10, (i + 1));
    }
    cin.get();
}

has the following problems in this piece of code:

cout << "x is " << strx << " and its permutations are ";
while (next_permutation(strx.begin(), strx.end())){
    cout << strx << " ";
    unsigned long long stoipermstrx = stoi(strx);
    tester.push_back(stoipermstrx);
}
cout << endl;
int sizetester = tester.size();
for (int j = 2; j <= 6; j++){
    cout << "j is " << j << ' ';
    for (int k = 0; k < sizetester; k++){
        if (j*x == tester[k]){
            cout << "counter increased because x, counter " << x << " " << counter << endl;
            counter++;
            if (counter == 6){
                cout << "Number is " << x << endl;
                return true;
            }
            break;
        }
    }
    //cout << "Number " << x << " failed" << endl;
    return false;
}

Here the output will be "j is j x is x and its permutations are (permutations of x)". HOWEVER, the console should print "x is x and its permutations are (permutations) j is j". The following sample output is given:

j is 2 x is 1355 and its permutations are 1535 1553 3155 3515 3551 5135 5153 531
5 5351 5513 5531
j is 2 x is 1356 and its permutations are 1365 1536 1563 1635 1653 3156 3165 351
6 3561 3615 3651 5136 5163 5316 5361 5613

Upvotes: 1

Views: 207

Answers (1)

frasnian
frasnian

Reputation: 2003

It appears there are two (minor) things about this. One, you are not looking at the value of sizetester before printing the value of j, and you are not printing a newline after the value of j. This means you are displaying the value of j for the previous loop at the beginning of your line for the current 'x'. If I understand what your code is supposed to be doing, it seems to be doing it correctly -- it's just the way that the output is getting displayed that makes it confusing.

Try this:

int sizetester = tester.size();
for (int j = 2; j <= 6; j++){
    if (sizetester){                           // <-- added test (see below)
        cout << "j is " << j << '\n';          // <-- added newline
    }                                          // <--

The test against sizetester suppresses spurious printings of values for j - you later test that (k < sizetester) anyway. The newline just prevents values of j from starting the line for the next values of x, which appears to be the cause of the confusing output.

Upvotes: 2

Related Questions