Jump to content

Cel Mai Mic Numar Care Se Poate Scrie Cu Cifrele Unui Numar


Recommended Posts

  • Moderators
Posted

Cerinţa
 

Să se scrie o funcție C++ care să returneze cel mai mic număr care se poate scrie cu cifrele unui număr natural transmis ca parametru.

 

Restricţii şi precizări

  • numele funcției va fi cmmnr
  • funcția va avea un parametru reprezentând numărul care se dă
  • numărul care se dă va fi mai mic decât 1.000.000.000

 

Eu am memorat cifrele nenule într-un vector şi am numărat câte cifre de 0 are.

 

Am sortat vectorul şi am introdus elementele vectorului în număr (care l-am iniţializat cu 0). După prima cifră, am introdus atâtea zerouri câte avea elementul iniţial. (ex:  80560 devine 50068)

#include <algorithm>

using namespace std;

unsigned int cmmnr(unsigned int numar)
{
    unsigned int cifre[20], elem_vector = 0, numar_cifre_nule = 0;

    while(numar != 0)
    {

        if (numar % 10 == 0)
        {
            numar_cifre_nule++;
        }
        else
        {
            cifre[elem_vector++] = numar % 10;
        }

        numar /= 10;
    }

    sort(cifre, cifre + elem_vector);

    numar = 0;

    for (int i=0 ; i < elem_vector ; i++)
    {

        if (i == 1)
        {

            if (numar_cifre_nule != 0)
            {
                for (int j = 1 ; j <= numar_cifre_nule ; j++)
                    numar *= 10;
            }
        }

        numar = numar * 10 + cifre[i];

    }

    return numar;
}
  • Upvote 1

  • Moderators
Posted

Sure.

unsigned int cmmnr(unsigned int numar)
{
    unsigned int cifre[20], elem_vector = 0, numar_cifre_nule = 0, i, j, aux;

    while( numar )
    {
        numar % 10 == 0 ? numar_cifre_nule++ : cifre[elem_vector++] = numar % 10;
        numar /= 10;
    }
    
    /**
     * Sortarea vectorului cifre[]
     */

    i = 0;

    while ( i < elem_vector )
    {
        j = i + 1;

        while ( j <= elem_vector )
        {
            if ( cifre[i] > cifre[j] )
            {
                aux = cifre[i];
                cifre[i] = cifre[j];
                cifre[j] = aux;
            }

            j++;
        }

        i++;
    }

    numar = 0;

    i = 0;

    while ( i < elem_vector )
    {
        if ( i == 1 && numar_cifre_nule )
        {
            j = 1;

            while ( j <= numar_cifre_nule )
            {
                numar *= 10;
                j++;
            }
        }

        numar = numar * 10 + cifre[i];
        i++;
    }

    return numar;
}
  • Moderators
Posted

E tot ce-mi vine-n cap momentan :))

 

Nu stiu daca e 100% bun. Din ce am testat, mi-a dat ok.

 

if, for si while. Daca vroiai doar if si while, arata mai naspa codul.

#include <iostream>

using namespace std;

int putere (int baza, int exponent)
{
    int i = 1, nr = 1;
    while ( i <= exponent )
    {
        nr *= baza;
        i++;
    }
    return nr;
}

int numar_cifre(int numar)
{
    int s = 0;
    while (numar)
    {
        s++;
        numar /= 10;
    }
    return s;
}

int cea_mai_mica_cifra(int numar)
{
    int cifra = 9;
    while (numar)
    {
        if (numar % 10 < cifra  && numar % 10 != 0)
            cifra = numar % 10;
        numar /= 10;
    }
    return cifra;
}

int cmmnr(int numar)
{
    int nr = 0, i, nr_cifre = numar_cifre(numar), j, cmmc = cea_mai_mica_cifra(numar), ok = 0;

    for (i = 1 ; i <= nr_cifre ; i++)
    {
        if (numar / putere(10, nr_cifre - i) % 10 == cmmc)
        {
            nr = nr * 10 + cmmc;
            break;
        }
    }

    for (i = 1 ; i <= nr_cifre ; i++)
    {
        if (numar / putere(10, nr_cifre - i) % 10 == 0)
            nr = nr * 10;
    }

    for (j = 1 ; j <= 9 ; j++)
    {
        for (i = 1 ; i <= nr_cifre ; i++)
        {
            if (numar / putere(10, nr_cifre - i) % 10 == j)
            {
                if (j == cmmc and !ok)
                {
                    ok = 1;
                }
                else
                {
                    nr = nr * 10 + j;
                }
            }
        }
    }

    return nr;
}

int main (void)
{
    cout << cmmnr(9054810);
    return 0;
}

 

1004589

  • Upvote 1

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.