Pagini: 1 ... 4 5 [6] 7 8 ... 13   În jos
  Imprimă  
Ajutor Subiect: 006 Factorial  (Citit de 108396 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
andreicanta
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« Răspunde #125 : Martie 18, 2008, 22:13:44 »

Imi puteti spune ce gresesc depaseste timpul de executie
Cod:
var nr,z,p,i:longint;
    f:text;
begin
  assign(f,'fact.in');reset(f);
  read(f,p);
  assign(f,'fact.out');rewrite(f);
  z:=0;i:=0;
  while z < p do
    begin
      inc(i,5);
      nr := i;
      while nr mod 5 = 0 do
        begin
          inc(z);
          nr := nr div 5;
        end;
    end;
  if z>p then
    writeln(f,-1)
  else if p = 0 then
    writeln(f,1)
  else
    writeln(f,i);
  close(f);
end.
Am incercat si cautare binara dar acolo la fiecare c (centru, mijloc) face descompunerea. Iar la mine face doar odata.
Ce am gresit ? sad
Memorat
razyelx
Client obisnuit
**

Karma: 0
Deconectat Deconectat

Mesaje: 82



Vezi Profilul
« Răspunde #126 : Martie 21, 2008, 00:44:25 »

as dori sa imi comfirmati daca sunt bune urmatoarele deduceri

!n       cifre de zero

125     31
150     38
175     44
200     51
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #127 : Martie 21, 2008, 01:09:10 »

Nu prea sunt corecte. Uite rezultatele:
125 - 31
155 - 38
180 - 44
210 - 51
Memorat
razyelx
Client obisnuit
**

Karma: 0
Deconectat Deconectat

Mesaje: 82



Vezi Profilul
« Răspunde #128 : Mai 03, 2008, 09:15:35 »

numa sa imi spuneti si mie preprocesare sau nu?
Memorat
Mishu91
Nu mai tace
*****

Karma: 169
Deconectat Deconectat

Mesaje: 751



Vezi Profilul
« Răspunde #129 : Mai 03, 2008, 09:29:27 »

Intra lejer si fara preprocesare
Memorat
cata00
Strain


Karma: 24
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #130 : Mai 27, 2008, 22:01:12 »

1/5 + 1/25 + 1/125 + 1/625 + ... converge la 1/4  Very Happy
Memorat
neagu1000123
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 2



Vezi Profilul
« Răspunde #131 : August 09, 2008, 13:18:14 »

deci.... am o problema... am facut binary search si am optimizat tot ce puteam, dar la 2 teste imi da tle (time limit execeded) ... am incercat sa schimb dr cu alata valoare decat 2000000000, dar in rest IMI DA MAI PUTIN  Fighting  Angry ... ajutor cineva ?


Multumesc anticipat
Memorat
05_Yohn
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 13



Vezi Profilul
« Răspunde #132 : August 11, 2008, 22:09:58 »

uita-te in pag 3 a topic-ului la primele 3 mesaje.. la fel ca si tine pierdea testele 3 si 15 Wink.. succes Smile
Memorat
Bogdan_tmm
De-al casei
***

Karma: 4
Deconectat Deconectat

Mesaje: 122



Vezi Profilul
« Răspunde #133 : Noiembrie 08, 2008, 23:55:01 »

Deci am si eu o problema.Am facut problema cu un soi de cautare binara,merge pentru testele din exemplu si totusi iau 0 puncte.Any idea?Crek fac ceva ce nu e permis in gnu dar totusi nu da eroare...
Memorat
Mishu91
Nu mai tace
*****

Karma: 169
Deconectat Deconectat

Mesaje: 751



Vezi Profilul
« Răspunde #134 : Noiembrie 09, 2008, 00:21:20 »

Incearca si alte teste, nu numai pentru cele din exemplu. Uite cateva
Nu prea sunt corecte. Uite rezultatele:
125 - 31
155 - 38
180 - 44
210 - 51
Memorat
Bogdan_tmm
De-al casei
***

Karma: 4
Deconectat Deconectat

Mesaje: 122



Vezi Profilul
« Răspunde #135 : Noiembrie 09, 2008, 00:25:33 »

si pentru astea merge Neutral
Memorat
criscer
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 2



Vezi Profilul
« Răspunde #136 : Noiembrie 11, 2008, 19:42:52 »

cum de creat o lista a numerelor prime in turbo pascal?

mersi anticipat
Memorat
venom4u31
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 8



Vezi Profilul
« Răspunde #137 : Noiembrie 15, 2008, 23:56:12 »

Parerea mea este ca x trebuie neaparat sa fie divizibil cu 5... Whistle Programul meu imi iese, dar nu merge compilatorul sad, sau ce este pe site de da note la programe Think... Problema ia destul de putin Smile... sper sa vad si eu cat am gresit Confused...
Memorat
chibicitiberiu
Strain
*

Karma: 3
Deconectat Deconectat

Mesaje: 49



Vezi Profilul
« Răspunde #138 : Ianuarie 08, 2009, 22:21:40 »

Salutare
Imi merge programul, dar nu si atunci cand nu gaseste nici un numar care sa indeplineasca conditiile: timp depasit. De asemenea compilatorul imi zice ca raspunsul e gresit dintr-un motiv necunoscut. Unde am gresit? Think
Cod:
#include<iostream.h>
#include<fstream.h>

ifstream in("fact.in");
ofstream out("fact.out");

int main()
{
int p,ok=0,n,twos=0,fives=0,pp;
in>>p;

for(n=1;ok==0 && n>0;n++)
{
pp=n;
while(pp%5==0 || pp%2==0){
if (pp%2==0) { twos++; pp=pp/2;}
if (pp%5==0) { fives++; pp=pp/5;}
}

if(twos>=p && fives>=p) ok=n;
}

if(ok==0) out<<-1;
else out<<ok;

out.close();
in.close();

return 0;
}
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #139 : Ianuarie 08, 2009, 22:32:39 »

@Tiberiu

Sursa ta este ineficienta. Citeste cele 6 pagini ale topicului si vei vedea ca se rezolva cu cautare binara. Si acel test cu raspuns gresit il iei pentru ca nu afisezi -1 cand nu exista N cu proprietatea ceruta, tu afisezi -1 cand ok e 0, nefiind niciodata 0.

Uite codul aici:

Cod:

#include<iostream.h>
#include<fstream.h>

ifstream in("fact.in");
ofstream out("fact.out");

int main()
{
int p,ok=0,n,twos=0,fives=0,pp;
in>>p;

for(n=1;ok==0 && n>0;n++)
{
pp=n;
while(pp%5==0){
if (pp%5==0) { fives++; pp=pp/5;}
}

if(fives>=p)
ok=n;
}

if(fives != p) out<<-1;
else out<<ok;

out.close();
in.close();

return 0;
}



http://infoarena.ro/job_detail/240954



Vezi ca nu trebuie sa tii cont si de 2-uri, ele vor fi intotdeauna mai multe decat cinciuri. Astfel, timpul se reduce destul de mult, si prinzi inca 2 teste. Gandeste-te la solutia cu cautare binara.

Spor Smile
« Ultima modificare: Ianuarie 08, 2009, 22:39:19 de către Pripoae Teodor Anton » Memorat
madflame
Strain


Karma: 5
Deconectat Deconectat

Mesaje: 12



Vezi Profilul
« Răspunde #140 : Ianuarie 28, 2009, 21:12:03 »

Propun o abordare fara cautare binara
Pentru P zerouri ne trebuiesc in N! sa apara 5 de P ori.
Intalnim un 5 la fiecare 5 numere, apoi intalnim un 5 in plus la fiecare 25 de numere, inca unu in plus la fiecare 125 de numere... si asa mai departe pana la 5^13 = 1220703125.
Plecand de la aceasta idee putem spune ca
P zerouri se gasesc in primele (P - (P div 5) - (P div 25) - (P div 125) - ... - (P div 5^13))*5 numere.
Rationamentul, zic eu, este corect, dar pe alocuri nu returneaza ce ar trebui.
Mi-a placut mai mult ideea aceasta deoarece algoritmul este minim...

EX: pentru P = 2 avem P * 5 = 10
               P = 7         (P - 1) * 5 = 30

Ma poate corecta cineva?
Memorat
shnako
Client obisnuit
**

Karma: 3
Deconectat Deconectat

Mesaje: 50



Vezi Profilul
« Răspunde #141 : Ianuarie 30, 2009, 23:43:35 »

Nu stiu de unde ai scos 5^13, dar am presupus ca ai dreptate. Mi-ar placea totusi sa stiu de unde l-ai scos.

Ideea ta in mare e buna, dar faci greseala fatala sa confunzi p cu n.
Exemplu:
Pentru p=5, algoritmul tau va da 20, dar raspunsul corect este 25.
Pentru p=31, algoritmul tau va da 115, dar raspunsul corect este 125.
Ideea e ca tu numeri cate numere sunt divizile cu n^k pana la numarul respectiv, cand tu defapt ar trebui sa numeri de cate ori apare numarul 5 pana la numarul respectiv.
5 in ecuatia ta va trebui inlocuit cu 6, 25 cu 31 si asa mai departe, conform urmatorului algoritm:
Cod:
#include <stdio.h>
#include <conio.h>
unsigned long t, s, i, n;
int main(void)
{
s=0;
scanf("%uld", &n);
for (i=1;i<=n/5;i++)
{
   s++;
   if (i%5==0)
    {
      t=i;
      while (t%5==0)
      {
         s++;
         t/=5;
         }
      }
   }
printf("%ld", s);
getch();
return 0;
}

Inlocuind toate acestea iti va da urmatoarea formula:
p=p-p/6-p/31-p/156-p/781-p/3906-p/19531-p/97656-p/488281-p/2441406-p/12207031-p/61035156-p/305175781;
n=5*p;
Problema e ca am reusit sa iau doar 20 puncte cu ea, restul Wrong Answer.
Asta e forma la care am ajuns. Sper ca observa cineva ce am gresit ca la ora asta nu se prea mai invart rotitele.
Cod:
#include <stdio.h>
long long p, t;
int main(void)
{
freopen("fact.in", "r", stdin);
freopen("fact.out", "w", stdout);
scanf("%lld", &p);
if (p==0)
printf("1");
else
{
t=p+1;
p=p-p/6-p/31-p/156-p/781-p/3906-p/19531-p/97656-p/488281-p/2441406-p/12207031-p/61035156-p/305175781;
t=t-t/6-t/31-t/156-t/781-t/3906-t/19531-t/97656-t/488281-t/2441406-t/12207031-t/61035156-t/305175781;
if (t==p)
printf("-1");    
else
printf("%lld", p*5);
}
fcloseall();
return 0;
}

Iar pentru varianta cu cautarea binara ... Poate spune cineva in detaliu ce caut cu el ? Ca pe forum am gasit numa bucati care nu se prea leaga. (P.S.: Nu imi explicati algoritmul ca il stiu, ci cum se implementeaza pentru problema asta ca nu reusesc sa-mi dau seama. Mersi.)
« Ultima modificare: Ianuarie 31, 2009, 01:07:03 de către Schnakovszki Vlad » Memorat
b_ady20
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #142 : Februarie 03, 2009, 19:36:18 »

Nu stiu de unde ai scos 5^13, dar am presupus ca ai dreptate. Mi-ar placea totusi sa stiu de unde l-ai scos.

Ideea ta in mare e buna, dar faci greseala fatala sa confunzi p cu n.
Exemplu:
Pentru p=5, algoritmul tau va da 20, dar raspunsul corect este 25.
Pentru p=31, algoritmul tau va da 115, dar raspunsul corect este 125.
Ideea e ca tu numeri cate numere sunt divizile cu n^k pana la numarul respectiv, cand tu defapt ar trebui sa numeri de cate ori apare numarul 5 pana la numarul respectiv.
5 in ecuatia ta va trebui inlocuit cu 6, 25 cu 31 si asa mai departe, conform urmatorului algoritm:
mdea... exista calculator si in windows ce are pana la 12 cifre sau depinde.. chiar mai multe.. cat despre idee este foarte buna, atat doar ca are nevoie doar de puteri ale lui 5 pana la 5^10 si probabil conditiile in caz ca p=5^x, unde x ia valori de la 1 la 10, nu le-a pus bine (prezinta cazuri particulare fata de formula lui) Smile In rest cred ca este bine si chiar in acest moment ma chinuiam sa-l fac sa mearga  Brick wall
Memorat
madflame
Strain


Karma: 5
Deconectat Deconectat

Mesaje: 12



Vezi Profilul
« Răspunde #143 : Februarie 03, 2009, 22:25:07 »

Ideea parea foarte ok... daca intreaga problema putea fi restransa la o formula era exceptional... dar nu este, mi-am dat seama dupa mult trial and error ce si cum.
5^13 este ultima putere a lui 5 care incape intr-un integer (4 byte int)
MACAR ca aproximatie bunicica ar putea fi folosita formula... am facut teste si greseste pentru numere mari undeva cam cu 8-9%, deci de la aproximatie spre numar se poate apela la un algoritm simplu de adunari repetate (sau fie... si cautare binara)
Memorat
b_ady20
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 7



Vezi Profilul
« Răspunde #144 : Februarie 04, 2009, 00:14:18 »

Ideea parea foarte ok... daca intreaga problema putea fi restransa la o formula era exceptional... dar nu este, mi-am dat seama dupa mult trial and error ce si cum.
5^13 este ultima putere a lui 5 care incape intr-un integer (4 byte int)
MACAR ca aproximatie bunicica ar putea fi folosita formula... am facut teste si greseste pentru numere mari undeva cam cu 8-9%, deci de la aproximatie spre numar se poate apela la un algoritm simplu de adunari repetate (sau fie... si cautare binara)
Pai imbunatatind metoda ta intr-un fel am reusit sa iau 10 puncte, iar cu alogrimul meu intial (ce foloseste o alta metoda) am obtinut 25 de puncte... sincer nu imi dau seama din ce cauza, deoarece cel care foloseste formula e mult mai eficient, insa la unele teste imi da Raspuns Incorect. 
 
Cod:
var i,p:longint;    a:array[1..100000000] of longint;
    f:text;
begin
assign (f,'fact.in');
reset (f);
readln (f,p);
close (f);
if p=0 then
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,1);
close(f);
end
else
begin
if p<=5 then
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,p*5);
close (f);
end
else
begin
a[1]:=5;
for i:=2 to (p div 5) do
begin
a[i]:=a[i-1]+6;
end;
dec(i);
if p=a[i] then
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,(p-(i-2)-((p*5) div (25*i)))*5);
close (f);
end
else
if p<a[i] then
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,(p+(i-1)-((p*5) div (25*(i-1))))*5);
close (f);
end
else
begin
assign (f,'fact.out');
rewrite (f);
writeln (f,(p-(i-1)-((p*5) div (25*i)))*5);
close (f);
end;
end;
end;
end.

e in stare cam bruta, stiu.. dar am incercat atatea variante, sa obtin un algoritm mai optim decat cel de 25 de puncte, incat mi`a pierit orice chef sa imi mai scurtcircuitez creierii  Smile

Editat de moderator: Era mai simplu si mai elegant sa folosesti tag-ul [ code ], in loc de:
Citat
[ color=green ][ b ][ b ][ b ][ shadow=red,left ]

« Ultima modificare: Februarie 04, 2009, 00:25:26 de către Paul-Dan Baltescu » Memorat
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #145 : Februarie 04, 2009, 00:27:36 »

Nu m-am uitat pe codul tau, desi presupun ca nu este pe ideea corecta. In schimb, mi-a sarit in ochi faptul ca declari 400 Mb (4 * 100 000 000, vectorul a). Iata una din greselile tale.

In plus, ar fi o idee buna sa va dezvatati sa mai postati codul tuturor problemelor care nu va ies. Nu e treaba comunitatii sa va depaneze sursele. O alternativa mai buna ar fi sa va ganditi de mai multe ori inainte sa incepeti sa codati si apoi sa incercati sa va gasiti greselile singuri.
Memorat

Am zis Mr. Green
shnako
Client obisnuit
**

Karma: 3
Deconectat Deconectat

Mesaje: 50



Vezi Profilul
« Răspunde #146 : Februarie 04, 2009, 13:45:16 »

Nu m-am uitat pe codul tau, desi presupun ca nu este pe ideea corecta. In schimb, mi-a sarit in ochi faptul ca declari 400 Mb (4 * 100 000 000, vectorul a). Iata una din greselile tale.

In plus, ar fi o idee buna sa va dezvatati sa mai postati codul tuturor problemelor care nu va ies. Nu e treaba comunitatii sa va depaneze sursele. O alternativa mai buna ar fi sa va ganditi de mai multe ori inainte sa incepeti sa codati si apoi sa incercati sa va gasiti greselile singuri.

Am stat 4 ore si tot am cautat de ce nu merge. Dupa 4 ore am ajuns la concluzia ca ori o las balta ori va intreb si pe voi. Am preferat a doua solutie. E ceva rau in asta?
Memorat
StefanFai
Strain


Karma: -3
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« Răspunde #147 : Februarie 14, 2009, 15:36:45 »

Aflam 0-urile prin impartirea la 5.(deoarece numarul de 0-uri=numarul de perechi 2*5)
Normal,am putea sa ii spunem sa imparta si la 2,si la 5,dar doar am complica,deoarece tot timpul 5 va fi la putere mai mica.

Sunt sigur ca rezultatul a fost trimis de foarte mult timp,dar poate trece cineva pe aici sa-mi spune daca am gandit bine.(si da,mi-e lene sa citesc 100+ comentarii).
Memorat
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #148 : Februarie 14, 2009, 18:29:13 »

Citat
(si da,mi-e lene sa citesc 100+ comentarii).
Si mie imi e lene sa iti raspund. Baga o sursa si vezi daca merge sau nu.
Memorat
Davide
Strain


Karma: -7
Deconectat Deconectat

Mesaje: 3



Vezi Profilul
« Răspunde #149 : Martie 10, 2009, 20:23:16 »

De cand 10! are mai putin de 2 cifre? Exemplul e gresit. 10! = 24320. Nu trebuie sa aiba mai mult de 2 cifre.

Ce sa zic... am uitat sa includ fisierele text...

[editat de moderator] foloseste butonul "modifica", nu mai posta consecutiv (e a doua oara in seara asta cand iti zic, nu?)
« Ultima modificare: Martie 10, 2009, 20:36:06 de către Sima Cotizo » Memorat
Pagini: 1 ... 4 5 [6] 7 8 ... 13   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines