Question

I have to input a number n, an a digit and a b digit and output the number n with all the a digits in it replaced by a b one. For example:

Input:
n = 1561525
a = 5
b = 9

Output:
n = 1961929

Should be recursive ! I didn't post any code as I've done it in a non-recursive way but apparently it's not even close to what I need.

Thanks for the help !

Was it helpful?

Solution

Check this, it works but maybe it is to much C

int convert(int num, int a, int b)
{
    if( num )
    {
        int res = convert(num/10,a,b);
        int t = num%10;
        res *=10;
        t = t == a ? b:t;
        res = res + t;
        return res;
    }
    return 0;
}

Divide by 10 the initial number, until nothing left of it, and then construct it again replacing a with b.

OTHER TIPS

To make things easier, you can convert the number into a string (a char[] in C++). Then, it's a simple matter of iterating over it and checking at each step if the number we want to replace was found in the current position. For a possible solution, here's an implementation of the algorithm in Python - one of the nice things of the language is that it reads almost as pseudocode, and it should be relatively simple to port to C++:

def aux(n, a, b, i):
    if i == len(n):
        return ''
    elif n[i] == a:
        return b + aux(n, a, b, i+1)
    else:
        return n[i] + aux(n, a, b, i+1)

def change(n, a, b):
    return int(aux(str(n), str(a), str(b), 0))

It works as expected:

change(1561525, 5, 9)
=> 1961929

So the easiest and safest way I can think of, is by using std::replace:

int replace(int num, int d1, int d2) {
    string s = std::to_string(num);                     // convert to string
    std::replace( s.begin(), s.end(), d1+'0', d2+'0');  // call std::replace

    return atoi( s.c_str() );                           // return the int
}

Now if you really have to use recursion (there is no need for it here), here's one possible solution:

using std::string;

// recursive function, accepts a string, current index, c2 replaces c1
string replace_rec (string s, unsigned index, char c1, char c2) {

    // check if the it's still a valid index
    if (index < s.size()) {

        // if this is a char to be converted, do so
        if (s[index] == c1)
            s[index] = c2;

        // call itself but with an updated string and incremented index
        replace_rec(s, index+1, c1, c2);
    }

    // the last call will result in the string with all chars checked. return it
    return s;
}

// call this function with input, the num to be replaced and what with
int replace(int num, int d1, int d2) {

    string s = std::to_string(num);   // convert to string

    // convert the result back to int and return it.
    return atoi( replace_rec(s, 0, d1+'0', d2+'0').c_str() ); 
}

In any case, you can call your replace() function like this:

int main(){

    cout << replace (4578, 4, 9);   // output: 9578
    cin.get();
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top