rU 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.
bJa sam tu radio velike brojeve. Razmisli o tome.
rRazmisljam , 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 ?
dPa on moze da vidi tvoj source, posto je vec uradio taj zadatak...
bSad cu pogledati, tek sam sad video post. Inace imas moj na onom postu sa nizom, koji je valjda postovala tijanakg :)
bGledao 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!? :)
rKada 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 .
rMoja 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.
bIzgleda 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.
rHvala na svemu snaci cu se nekako.
najd 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!!!
bPošalji mi na mejl. Pogledaću malo kasnije.
Mejl je boba5555@gmail.com
bTvoja 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,
rBobo mozes li i meni da posaljes kod na relja.petrovic@gmail.com , plz.
bNisam bio kući, zato ti kasno šaljem. Samo mi odgovori da li si dobio. Ako ti treba neki komentar, javi se ponovo.
Laku noć.
ndobio 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 ...
:]
ni brate ... ne mogu da verujem ... sad sa realnim samo 3. test primer ispada tacan!!! ostali su "pogresno resenje"!!!
u cemu je fora ???
bNemoj 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.
rZnas 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.
nbobo, mislis na sabiranje dva broja upamcena u dva niza?
bDa. 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.
npa 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!!!
bMožeš da staviš i osnovu 10, isto je.
bBrate š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.
na poredak je inverzni i samo treba da se odstampa naopako?
izvini sto smaram ovolko!
bNe smaraš.
Da, samo odštampaš ''naopačke'' i to je to. Tako je.
Poslao sam ti sad i proc za štampanje.
nuspeo 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.
bDa, 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.
npogledao sam ponovo: a je matrica koja se popunjava, a samo joj je prva vrsta ispunjena kecevima!
u svakom slucaju... obracacu paznju!
:]
radmin ,mozes li da mi das 7. test primer ovog zadatka.Molim te.
Samo mi na njemu puca program.
Pozdrav
rZadatak resen .
Postojala je sitna greska pri ispisu.
Pozdrav