👤

Să se afiseze toate numerele naturale mai mici decât n care au propietatea că pătratul și cubul fiecăruia au cel puțin o cifră comună ; pentru fiecare număr găsit să se afiseze câte cifre sunt comune și care sunt acelea .

Răspuns :

#include <iostream>
#include <bitset>
using namespace std;

int pow(int e, int p)
{
    int sol = 1;

    while(p) {
        if(p & 1) sol *= e;
        e *= e;
        p /= 2;
    }

    return sol;
}

void sol(int a, int b, int val)
{
    int nr = 0;
    bool ok = false;
    bitset<10> cfrA, cfrB;

    while(a) cfrA[a % 10] = true, a /= 10;
    while(b) cfrB[b % 10] = true, b /= 10;


    for(int i = 0; i < 10; i++)
        if(cfrA[i] && cfrB[i])
            { ok = true; break; }

    if(ok) {
        cout << "Numarul este: " << val << " <=> Cifrele comune sunt: ";
        for(int i = 0; i < 10; i++)
            if(cfrA[i] && cfrB[i])
                cout << i << ' ', nr++;

        cout << " <=> Numarul de cifre comune este: " << nr << '\n';
    }
}

int main()
{
    int n;

    cin >> n;
    for(int i = 1; i <= n; i++)
        sol(pow(i, 2), pow(i, 3), i);
    return 0;
}