[ 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]
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.