Jump to content

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


Courage

Recommended Posts

  • Moderators

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
Link to comment
Share on other sites

  • Moderators

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;
}
Link to comment
Share on other sites

  • Moderators

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
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • 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.