← Back to topics
Topic

Dafina-Overflow

r
renovator
U cemu bih mogao da gresim posto mi za vece zadate vrednosti za broj brojeva :)ni long long ne pomaze(Program sam detaljno testirao i sve vrednost koje ne premasuju High(long long) predstavljaju tacan rezultat).
Poz.
b
boba5551
Ja sam tu radio velike brojeve. Razmisli o tome.
r
renovator
Razmisljam , ali nikako da mi padne na pamet zasto gresim .Da li bi mi dozvolio da ti posaljem na mail source posto ne bih bas preterivao sa postavljanjem coda ?
d
dimitar
Pa on moze da vidi tvoj source, posto je vec uradio taj zadatak...
b
boba5551
Sad cu pogledati, tek sam sad video post. Inace imas moj na onom postu sa nizom, koji je valjda postovala tijanakg :)
b
boba5551
Gledao sam kod, ali ima stvari koje mi nisu jasne. Poslao sam tvoje resenje i imas gresaka, odnosno tacna su ti samo 4 test primera, ostalo su greske.
Evo ti ideja.
Imas matricu N x K i Polje i,j (D[i,j])ti govori na koliko nacina mozes da dobijes broj duzine i sa poslednjom cifrom j. Onda je logicno da kad racunas
D[i+1,j]=D[i,j-1]+D[i,j]+D[i,j+1] jer za poslednju cifru imas jednu od tri mogucnosti
1. preposlednja-1
2. petposlednja
3. pretposlednja+1

Pa se zato tako racuna. Na kraju saberes sve D[N,i] gde i ide od 1 do K i to je to.
Nadam se da sam ti pomogao!? :)
r
renovator
Kada sam rekao da su mi sva resenja tacna sem overflowo-vanih , nisam mislio na resenja na situ , vec ona koja sam ja isprobao.
Hvala ti .Razmotricu ovo sto si napisao .
r
renovator
Moja ideja skoro ista.
Pazi sta sam ja radio :
Imam matricu (K div 2)x(N) i sad sa a[0][j]=1 pocinjem da dodajem :
a[i][j+1]=a[i][j] - ako se ne nalazi na poziciji 0(na vrhu)
a[i][j-1] =a[i][j] - ako se ne nalazi na dnu(k)
a[i][j] =a[i][j]

E sad ukoliko je to prvi put da upisujem vrednosti (za svako i) onda stoji '=' ali ako nije onda dodajem na gornja dva (+=) donji izjednacavam sa a[i][j] (naravno u sve u zavisnosti da se pokazivac nalazi na dnu,u sredini ili na vrhu.
Ukoliko je i = n-1 onda sabiram sve vrednosti koje dodajem i to sve dodam na ukupan broj laz novcanica.
To pomnozim sa 2(posto je simetricno).
Ukoliko je k mod 2 =1 onda i sracunam i za (k div 2 )+1 i to dodam i to je to ,
ALi izgleda da nije.
b
boba5551
Izgleda da nije.
Moj savet (a verujem i ostalih koji ovde dolaze) je da ne komplikujes ako nema potrebe. Nemoj stedeti memoriju ako ne moras. Neka ti na prvom mestu bude kratak i citak kod, jer ces tako lakse i debagirati ako treba.
r
renovator
Hvala na svemu snaci cu se nekako.
n
nalism
ajd i ja da se nadovezem!
ja sam ubedjen da je ideja koju je izbacio "bobo" ona koja donosi resenja!
e sad, ubedjen sam u to iako su mi samo 2 test primera radila kada sam ja poslao!
a potpuno je isti postupak kao sto je "bobo" opisao!

jel' te ne mrzi "bobo" da pogledas to moje?

p.s. nemojte misliti da sam sad iskoristio priliku sto je dato resenje pa pokusao da uradim zadatak... mogu vas ubediti (ako zelite) da sam ga pokusavao i ranije na isti ovaj nacin!!!
b
boba5551
Pošalji mi na mejl. Pogledaću malo kasnije.
Mejl je boba5555@gmail.com
b
boba5551
Tvoja ideja je ok, ali kao sto sam napisao i renovatoru, moras korisiti velike brojeve. Za male vrednosti (prva dva) test primera ti prolazi, ali dalje ne. Ideja ti je dobra, ali moraju ici veliki brojevi.
Ako hoces, mogu ti poslati moj kod na mejl, pa ces videti da je stvarno tako.
Nadam se da sam ti pomogao.
Pozdrav,
r
renovator
Bobo mozes li i meni da posaljes kod na relja.petrovic@gmail.com , plz.
b
boba5551
Nisam bio kući, zato ti kasno šaljem. Samo mi odgovori da li si dobio. Ako ti treba neki komentar, javi se ponovo.
Laku noć.
n
nalism
dobio sam, dobio sam mail ... ok je!
i meni je palo na pamet da ce biti problema oko tih velikih brojeva al sta da mu radim - kako da prosirim na vise - kad sam vec stavio longint a u pasca-u su to max celobrojni ...

pa da ... probacu sa realnim ... mozda i izvuce ...

:]
n
nalism
i brate ... ne mogu da verujem ... sad sa realnim samo 3. test primer ispada tacan!!! ostali su "pogresno resenje"!!!

u cemu je fora ???
b
boba5551
Nemoj to raditi. Pogledaj kako sam ja to uradio. Implementiraj velike brojeve, pa umesto br1+br2 ti pozoveš proceduru saberi (br1, br2, zbir) i onda to uradiš kao kad sabiraš ručno. Nemoj pokušavati, neće ti opet stati.
r
renovator
Znas kako se radi (bobo mnogo ti hvala na ovome).
Recimo imas broj 123123123123123123.
Sad ti njega izdelis u niz tipa recimo longint.
Znaci bice :
n[1]=123123123,
n[2]=123123123
sad kad spojis n[1] i n[2] dobijas broj gore.
Znaci rastavljas broj.
n
nalism
bobo, mislis na sabiranje dva broja upamcena u dva niza?
b
boba5551
Da. Pretpostavljam da znas da radis sa bilo kojom osnovom. Pa ovde radis sa osnvom recimo 10000 ili 1000000, pa ti sam sabiras kucice kako treba i dodajes kad treba. Evo ti taj deo koda ya sabiranje da shvatis, isto ti je kao i pismeno sabiranje.


const
Cifre=30; - stavi šta hoćeš
type
Niz=array[1..Cifre] of longint;


procedure DodajVrednost(i:longint;var BN:Niz);
var
j:integer;
begin
BN[1]:=BN[1]+i;
j:=1;
while BN[j]>1000000 do
begin
BN[j+1]:=BN[j] div 1000000;
BN[j]:=BN[j] mod 1000000;
inc(j)
end
end;

procedure SaberiDvaVelika(B1,B2:Niz;var BN:Niz);
var
i:integer;
prenos:longint;
begin
prenos:=0;
for i:=1 to Cifre do
begin
BN[i]:=(B1[i]+B2[i]+prenos) mod 1000000;
prenos:=(B1[i]+B2[i]+prenos) div 1000000
end
end;

Jel' sad malo jasnije?
Nema na čemu renovator.
n
nalism
pa da ... jasnije je ...
a, recimo kada bih radio sa osnovom 10 (kao obicno - rucno sabiranje) bila bi mi potrebna samo procedura "sabiranje dva velika" ili kako se vec zove, i to radjeno sa mod i div 10! jel da?

e sad, vezano za samo to sabiranje!
jesu li ti svi primeri prosli ako si ovakvu proceduru isprobao na sajtu?
cini mi se da, ako se ovako formira for petlja (for i:=1 to Cifra) ima da se sabere prva cifra prvog i prva cifra drugog broja... Dakle moras brojeve da pamtis u inverznom poretku!!!
b
boba5551
Možeš da staviš i osnovu 10, isto je.
b
boba5551
Brate šaljem ti ceo kod. Toliko puta sam to uradio da sigurno radi taj način sa velikim brojevima. To što si napisao na neki način ima smisla, ali zar tebi na mestu jedan mora da bude najteža cifra? Evo ti ceo kod, možda sam i ja nešto izostavio pošto te nisam baš najbolje shvatio pta ti nije jasno.
Ovo je inače sigurno prošlo.

program Dafina;
const
MaxN=100;
MaxK=20;
Cifre=30;
type
Niz=array[1..Cifre] of longint;
Matrix=array[1..MaxN,0..MaxK+1] of Niz;
var
D:Matrix;
N,K,i,j:integer;
Res:niz;

procedure PostaviNula(var BN:Niz);
var
i:integer;
begin
for i:=1 to Cifre do
BN[i]:=0
end;

procedure DodajVrednost(i:longint;var BN:Niz);
var
j:integer;
begin
BN[1]:=BN[1]+i;
j:=1;
while BN[j]>1000000 do
begin
BN[j+1]:=BN[j] div 1000000;
BN[j]:=BN[j] mod 1000000;
inc(j)
end
end;

procedure SaberiDvaVelika(B1,B2:Niz;var BN:Niz);
var
i:integer;
prenos:longint;
begin
prenos:=0;
for i:=1 to Cifre do
begin
BN[i]:=(B1[i]+B2[i]+prenos) mod 1000000;
prenos:=(B1[i]+B2[i]+prenos) div 1000000
end
end;

procedure Init;
var
i,j:integer;
begin
for i:=1 to N do
for j:=0 to K+1 do
PostaviNula(D[i,j]);
for i:=1 to K do
DodajVrednost(1,D[1,i])
end;

function BrojCifara(x:longint):integer;
var
i:integer;
begin
i:=0;
while x>0 do
begin
x:=x div 10;
inc(i)
end;
BrojCifara:=i
end;

procedure Ispis(BN:Niz);
var
i,j,k:integer;
begin
i:=Cifre;
while BN[i]=0 do
dec(i);
write(BN[i]);
for j:=i-1 downto 1 do
begin
for k:=1 to 6-BrojCifara(BN[j]) do
write('0');
write(BN[j])
end
end;

begin
readln(N,K);
Init;
for i:=2 to N do
for j:=1 to K do
begin
SaberiDvaVelika(D[i-1,j-1],D[i-1,j],D[i,j]);
SaberiDvaVelika(D[i,j],D[i-1,j+1],D[i,j])
end;
PostaviNula(Res);
for i:=1 to K do
SaberiDvaVelika(D[N,i],Res,Res);
Ispis(Res)
end.
n
nalism
a poredak je inverzni i samo treba da se odstampa naopako?

izvini sto smaram ovolko!
b
boba5551
Ne smaraš.
Da, samo odštampaš ''naopačke'' i to je to. Tako je.
Poslao sam ti sad i proc za štampanje.
n
nalism
ok ok ok ...
n
nalism
uspeo sam, brate, hvala ti mnogo!!!!

al moram da te zamolim da pogledas kako sam odradio!
:]
radio sam sa brojevnim sistemom 10 pa sam zato stavio 7*30 umesto tvojih 30 clanova niza "niz" (jer je kod tebe taj niz ispunjen longintom koji ima max 7 cifara). ali tada nije prolazilo na 2, 3 testa zbog vremena, pa sam smanjio na 200 umesto 210 i proslo je sve!!!

u kodu postoji jedan veliki deo (koji "ne vazi") koji racuna zbir dva niza ali u normalnom poretku cifara ... mnooogo je duzi od ovog inverznog tako da se veoma "isplati" ovaj forum!!!

hvala jos jedared.
b
boba5551
Da, ovo je dobro. Mada mi se cini da nisi igde inicijalizovao ceo niz a[i,1]. Ti si postavio vrednost samo prvoj “kucici”, ali sta je sa ostalima? Moguce je da FreePascal sam to radi, ali ne treba da ti to bude navika. Ostatak treba da bude nula. Samo to, ostalo je u redu.
n
nalism
pogledao sam ponovo: a je matrica koja se popunjava, a samo joj je prva vrsta ispunjena kecevima!

u svakom slucaju... obracacu paznju!

:]
r
renovator
admin ,mozes li da mi das 7. test primer ovog zadatka.Molim te.
Samo mi na njemu puca program.
Pozdrav
r
renovator
Zadatak resen .
Postojala je sitna greska pri ispisu.
Pozdrav