[ yoMas @ 29.12.2010. 17:20 ] @
eiii ljudi ;)

Nadam se da mi neko od programera moze pomoci...

Imam zadatak :

Neka je n1 proizvod cifara broja n, n2 proizvod cifara broja n1, n3 proizvod cifara broja n2 itd... najmanji broj k za koji vrijedi da je nk jednocifren broj naziva se multiplikativna otpornost broja n.
Npr. multiplikativna otpornost broja 6788 iznosi 6 , jer je
n1=6*7*8*=2688,
n2=2*6*8*8=768,
n3=7*6*8=336,
n4=3*3*6=54,
n5=5*4=20,
n6=2*0=0;

Napisati program za prirodan broj n unijet sa tastature racunara i ispisuje njegovu multiplikativnu otpornost ...
[ Nedeljko @ 30.12.2010. 12:08 ] @
Code:
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void process(vector<char> &n) {
    while (n.size() > 1) {
        for (size_t i = 0; i < n.size(); ++i) {
            if (n[i] == 0) {
                n.clear();

                return;
            }
        }

        vector<char> n1;

        n1.push_back(1);

        for (size_t i = 0; i < n.size(); ++i) {
            int digit = n[i];

            for (size_t j = 0; j < n1.size(); ++j) {
                n1[j] *= digit;
            }

            char carry = 0;

            for (size_t j = 0; j < n1.size(); ++j) {
                char value = n1[j] + carry;

                carry = value / 10;
                n1[j] = value - 10*carry;
            }

            if (carry > 0) {
                n1.push_back(carry);
            }
        }

        n = n1;
    }
}

int main() {
    string input;
    cin >> input;
    vector<char> n;

    for (int i = input.size() - 1; i != -1; --i) {
        n.push_back(input[(size_t) i] - '0');
    }

    process(n);

    if (n.empty()) {
        cout << "0";
    } else {
        for (int i = n.size() - 1; i != -1; --i) {
            cout << ((int) n[(size_t) i]);
        }
    }

    cout << endl;

    return 0;
}
[ kiklop74 @ 30.12.2010. 14:40 ] @
Moze to i malo jednostavnije:

Code:

#include <cstdlib>
#include <cmath>
#include <string>
#include <iostream>

int product(int value) {
    int result = 1;
    for(int operv=std::abs(value); operv > 0; ) {
        result *= (operv % 10);
        operv = static_cast<int>(std::floor(operv / 10.0f));
    }
    return result;
}

int process(int value) {
    int result = 0;
    for (result=1, value=product(value); value > 0; ++result) {
        value=product(value);
    }
    return result;
}


int main(void) {
    
    int input = 0;
    std::cin >> input;

    std::cout << process(input) << std::endl;
    
    return EXIT_SUCCESS;
}
[ Nedeljko @ 30.12.2010. 15:05 ] @
A šta ako ti korisnik unese broj sa 1000 cifara? Moj program radi i u tom slučaju.
[ kiklop74 @ 30.12.2010. 16:59 ] @
Tvoj program svakako podrzava mnogo vece brojeve od mog ali ipak ima ogranicenje u smislu da proizvodi cifara unetog broja ne moze da bude veci od INT_MAX - sto naravno pogadja i moju verziju.

Resenje za bilo koji broj bi moglo da se izvede uz koriscenje neke od biblioteka za velike brojeve kao bigint - https://mattmccutchen.net/bigint/

[ yoMas @ 30.12.2010. 17:19 ] @
Hvala Vam punoooo na pomoci oko zadatka...
Takoder zelim Vam sve najbolje u narednoj 2011.-toj godini.
[ Nedeljko @ 30.12.2010. 19:20 ] @
Citat:
kiklop74: Tvoj program svakako podrzava mnogo vece brojeve od mog ali ipak ima ogranicenje u smislu da proizvodi cifara unetog broja ne moze da bude veci od INT_MAX - sto naravno pogadja i moju verziju.

Resenje za bilo koji broj bi moglo da se izvede uz koriscenje neke od biblioteka za velike brojeve kao bigint - https://mattmccutchen.net/bigint/


Odakle ti to uopšte? Moj program nema nikakva ograničenja osim raspoložive memorije. Proizvod cifara se ne računa kao int, nego kao string cifara. Dakle, rezultat množenja cifara je opet string.
[ kiklop74 @ 30.12.2010. 19:38 ] @
Povlacim receno. U pravu si.
[ sonus70 @ 31.12.2010. 08:05 ] @
Aj jedno laičko pitanje.
Čemu uopšte služi ta multiplikativna otpornost?
Ima neku upotrebnu vrednost ili čisto služi profanima za ispitna pitanja?
[ Nedeljko @ 31.12.2010. 08:49 ] @
Biće da je to drugo.
[ Nedeljko @ 04.01.2011. 14:03 ] @
Zanimljivo je da nijedan od dva priložena programa nije tačan.
[ kiklop74 @ 04.01.2011. 16:20 ] @
Mda, u pravu si.

U slucaju primera koji sam poslao treba modifikovati uslov u petlji u funkciji process

Code:


int process(int value) {
    int result = 0;
    for (result=1, value=product(value); value > 9; ++result) {
        value=product(value);
    }
    return result;
}

[ saxhax @ 23.11.2011. 19:34 ] @
mislim da je ovo zadatak namijenjen za pocetnike pa da nebismo komlikovali evo jednostavno rjesenje...

#include <iostream>
using namespace std;
int main()
{
long long n,m,v(0),d(1);
cin>>n;
m=n;
while (1)
{while (m!=0)
{ d=d*(m%10); m=m/10;} v++; if (d<10) break; else {m=d; d=1;}}
cout<<v;
system("pause");
return 0;
}
[ mustafa12 @ 04.05.2016. 22:27 ] @
zadnje rjesenje je najbolje i najbrze


[Ovu poruku je menjao mustafa12 dana 05.05.2016. u 00:11 GMT+1]