Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
Shirohige Forumaš(ica)
Pridružen/a: 16. 11. 2012. (20:19:56) Postovi: (ED)16
Spol:
|
Postano: 12:33 ned, 7. 4. 2013 Naslov: |
|
|
Zadatak iz zadaće, Rekurzije 2:
Dobio sam na mail provjeru i piše:
Provjera zad: 1 (netočno za input: 2 6)
Usporedio sam rezultate na stranici za zadaće i svog programa i ispadne isto:
[url]http://img90.imageshack.us/img90/2746/epruveti.png[/url]
Je li problem možda u formatu ispisa?
Moj main:
[code:1]int main(void)
{
int n,p;
scanf("%d", &p);
scanf("%d", &n);
printf("%d", novi(p, n, 1, p));
return 0;
}[/code:1]
Zadatak iz zadaće, Rekurzije 2:
Dobio sam na mail provjeru i piše:
Provjera zad: 1 (netočno za input: 2 6)
Usporedio sam rezultate na stranici za zadaće i svog programa i ispadne isto:
http://img90.imageshack.us/img90/2746/epruveti.png
Je li problem možda u formatu ispisa?
Moj main:
Kod: | int main(void)
{
int n,p;
scanf("%d", &p);
scanf("%d", &n);
printf("%d", novi(p, n, 1, p));
return 0;
} |
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
Shirohige Forumaš(ica)
Pridružen/a: 16. 11. 2012. (20:19:56) Postovi: (ED)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
Shirohige Forumaš(ica)
Pridružen/a: 16. 11. 2012. (20:19:56) Postovi: (ED)16
Spol:
|
|
[Vrh] |
|
hendrix Forumaš(ica)
Pridružen/a: 03. 09. 2012. (15:59:06) Postovi: (92)16
|
Postano: 20:05 ned, 14. 4. 2013 Naslov: |
|
|
Imam pitanje, dakle, ne treba mi analiza koda (s debuggiranjem ću se rado sam zabavljati :D, a i znam da je kod neoptimiziran. Jako.), nego čisto "primjer" na čemu kôd padne, ja nisam našao nešto razumno, a zadatak mi pada na nekom primjeru koji mi ne stane preko cijelog ekrana kad mi dođe na mail. :D
Zadatak glasi:
Napišite program koji učitava jednu liniju teksta s najviše 14150 znakova. Tom tekstu treba izbrisati svaku 4. riječ, a ostalima izokrenuti redoslijed slova (same riječi ostaju u originalnom poretku). Tako dobiveni tekst treba ispisati.
Možete pretpostaviti da tekst sadrži samo slova i razmake.
Moj glup kod je:
[code:1]#include <stdio.h>
#include <string.h>
void invert(char *s, int start, int end)
{
int i, strlen_s = end - start + 1;
char t;
for (i = 0; i < strlen_s/2; ++i)
{
t = s[start + i];
s[start + i] = s[end - i];
s[end - i] = t;
}
}
int main(void)
{
char s[14150], i, word_cnt = 0, begin, strlen_next, j;
scanf("%[^\n]", s);
for (i = 0; i < strlen(s) && s[i] != '\0'; ++i)
{
if (s[i] == ' ')
{
begin = i+1;
word_cnt++;
}
strlen_next = 0;
if (word_cnt%4 == 3)
for (j = begin; s[j] != ' ' && s[j] != '\0'; ++j)
strlen_next++;
for (j = begin; j < strlen(s) - strlen_next; ++j)
s[j] = s[j + strlen_next];
s[j] = '\0';
}
for (i = 0; i < strlen(s) - 1; ++i)
{
if (s[i] == ' ' && s[i+1] == ' ')
for (j = i; j < strlen(s) - 1; ++j)
s[j] = s[j+1];
s[j] = '\0';
}
int start, end;
for (i = 0; s[i] != '\0'; ++i)
{
j = i-1;
if (s[j] == ' ' || i == 0)
{
if (i == 0)
start = i;
else
start = j+1;
j++;
while (s[j] != ' ' && s[j] != '\0')
j++;
end = j-1;
invert(s, start, end);
}
}
printf("%s", s);
return 0;
}
[/code:1]
Imam pitanje, dakle, ne treba mi analiza koda (s debuggiranjem ću se rado sam zabavljati , a i znam da je kod neoptimiziran. Jako.), nego čisto "primjer" na čemu kôd padne, ja nisam našao nešto razumno, a zadatak mi pada na nekom primjeru koji mi ne stane preko cijelog ekrana kad mi dođe na mail.
Zadatak glasi:
Napišite program koji učitava jednu liniju teksta s najviše 14150 znakova. Tom tekstu treba izbrisati svaku 4. riječ, a ostalima izokrenuti redoslijed slova (same riječi ostaju u originalnom poretku). Tako dobiveni tekst treba ispisati.
Možete pretpostaviti da tekst sadrži samo slova i razmake.
Moj glup kod je:
Kod: | #include <stdio.h>
#include <string.h>
void invert(char *s, int start, int end)
{
int i, strlen_s = end - start + 1;
char t;
for (i = 0; i < strlen_s/2; ++i)
{
t = s[start + i];
s[start + i] = s[end - i];
s[end - i] = t;
}
}
int main(void)
{
char s[14150], i, word_cnt = 0, begin, strlen_next, j;
scanf("%[^\n]", s);
for (i = 0; i < strlen(s) && s[i] != '\0'; ++i)
{
if (s[i] == ' ')
{
begin = i+1;
word_cnt++;
}
strlen_next = 0;
if (word_cnt%4 == 3)
for (j = begin; s[j] != ' ' && s[j] != '\0'; ++j)
strlen_next++;
for (j = begin; j < strlen(s) - strlen_next; ++j)
s[j] = s[j + strlen_next];
s[j] = '\0';
}
for (i = 0; i < strlen(s) - 1; ++i)
{
if (s[i] == ' ' && s[i+1] == ' ')
for (j = i; j < strlen(s) - 1; ++j)
s[j] = s[j+1];
s[j] = '\0';
}
int start, end;
for (i = 0; s[i] != '\0'; ++i)
{
j = i-1;
if (s[j] == ' ' || i == 0)
{
if (i == 0)
start = i;
else
start = j+1;
j++;
while (s[j] != ' ' && s[j] != '\0')
j++;
end = j-1;
invert(s, start, end);
}
}
printf("%s", s);
return 0;
}
|
|
|
[Vrh] |
|
briemann0 Forumaš(ica)
Pridružen/a: 12. 10. 2012. (18:45:05) Postovi: (5)16
Spol:
|
|
[Vrh] |
|
hendrix Forumaš(ica)
Pridružen/a: 03. 09. 2012. (15:59:06) Postovi: (92)16
|
|
[Vrh] |
|
Silenoz Forumaš(ica)
Pridružen/a: 15. 10. 2011. (18:45:11) Postovi: (4F)16
Spol:
|
Postano: 6:24 sri, 17. 4. 2013 Naslov: |
|
|
[quote]Zadatak 3:
Napišite program koji učitava prirodni broj k < 9, te niz od k različitih dekadskih znamenaka. Ukoliko učitane znamenke nisu različite, program treba ispisati poruku "Greska!" (bez navodnika).
Program treba ispisati sumu svih prirodnih brojeva čije su znamenke iz učitanog niza, te se ne ponavljaju unutar jednog broja.
Na primjer, za k = 2 i učitane brojeve 1 i 3, program ispisuje "48" (jer je 1+3+13+31=48).[/quote]
[code:1]#include <stdio.h>
int zbrojzn(int n, int zbr, int k)
{if (n==0) return 0;
n=zbr*k+zbrojzn(n-1,zbr, k*10+1);
return n;}
int main(void)
{int k, zbr, i, j,zn[10];
zbr=0;
scanf("%d",&k);
for (i=0; i<k;i++)
{scanf("%d",&zn[i]);
}
for (i=0; i<k;i++)
{
for (j=0;j<i;j++)
{if (zn[j]==zn[i])
{printf ("Greska!");
return 0;
}
}
zbr+=zn[i];
}
printf("%d", zbrojzn(k, zbr,1));
return 0;
}[/code:1]
Zašto mi ovo ne radi? Tj radi, ali sajt za zadaće kaže da ne valja.
Citat: | Zadatak 3:
Napišite program koji učitava prirodni broj k < 9, te niz od k različitih dekadskih znamenaka. Ukoliko učitane znamenke nisu različite, program treba ispisati poruku "Greska!" (bez navodnika).
Program treba ispisati sumu svih prirodnih brojeva čije su znamenke iz učitanog niza, te se ne ponavljaju unutar jednog broja.
Na primjer, za k = 2 i učitane brojeve 1 i 3, program ispisuje "48" (jer je 1+3+13+31=4. |
Kod: | #include <stdio.h>
int zbrojzn(int n, int zbr, int k)
{if (n==0) return 0;
n=zbr*k+zbrojzn(n-1,zbr, k*10+1);
return n;}
int main(void)
{int k, zbr, i, j,zn[10];
zbr=0;
scanf("%d",&k);
for (i=0; i<k;i++)
{scanf("%d",&zn[i]);
}
for (i=0; i<k;i++)
{
for (j=0;j<i;j++)
{if (zn[j]==zn[i])
{printf ("Greska!");
return 0;
}
}
zbr+=zn[i];
}
printf("%d", zbrojzn(k, zbr,1));
return 0;
} |
Zašto mi ovo ne radi? Tj radi, ali sajt za zadaće kaže da ne valja.
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 6:52 sri, 17. 4. 2013 Naslov: |
|
|
Zato sto si si nastimao za neki mali primjer (vjerojatno ovaj iz zadace) i ocekujes da radi i za vece.
Basically, tvoj program racuna [tex]zbr + 11zbr + 111zbr + \dots[/tex] (rekurzija ti za to uopce ne treba). Nemam nista protiv, ali dokazi (matematicki) zasto bi ta formula bila dobra.
Recimo, za brojeve 1, 2, 3:
[tex]1+2+3+12+13+21+23+31+32+123+132+213+231+312+321 = 1470[/tex],
a tebi ispada
[tex]1\cdot(1+2+3) + 11\cdot(1+2+3) + 111\cdot(1+2+3) = 738[/tex].
Zato sto si si nastimao za neki mali primjer (vjerojatno ovaj iz zadace) i ocekujes da radi i za vece.
Basically, tvoj program racuna [tex]zbr + 11zbr + 111zbr + \dots[/tex] (rekurzija ti za to uopce ne treba). Nemam nista protiv, ali dokazi (matematicki) zasto bi ta formula bila dobra.
Recimo, za brojeve 1, 2, 3:
[tex]1+2+3+12+13+21+23+31+32+123+132+213+231+312+321 = 1470[/tex],
a tebi ispada
[tex]1\cdot(1+2+3) + 11\cdot(1+2+3) + 111\cdot(1+2+3) = 738[/tex].
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
Silenoz Forumaš(ica)
Pridružen/a: 15. 10. 2011. (18:45:11) Postovi: (4F)16
Spol:
|
Postano: 7:11 sri, 17. 4. 2013 Naslov: |
|
|
[quote="vsego"]Zato sto si si nastimao za neki mali primjer (vjerojatno ovaj iz zadace) i ocekujes da radi i za vece.
Basically, tvoj program racuna [tex]zbr + 11zbr + 111zbr + \dots[/tex] (rekurzija ti za to uopce ne treba). Nemam nista protiv, ali dokazi (matematicki) zasto bi ta formula bila dobra.
Recimo, za brojeve 1, 2, 3:
[tex]1+2+3+12+13+21+23+31+32+123+132+213+231+312+321 = 1470[/tex],
a tebi ispada
[tex]1\cdot(1+2+3) + 11\cdot(1+2+3) + 111\cdot(1+2+3) = 738[/tex].[/quote]
Hvala, nisam išao za tim.
Zapravo formula bi bila zbr +(n-1)*(11*zbr+111*zbr..).
Jesam u pravu? Ili na četveroznamenkastima ima još više kombnacija?
Kako bih onda rekurzijom trebao rješavati? Makar, ovo mi se čini daleko najjednostavnije i najbrže izbršeno (osim ako 'genijalac' kao ja ne zafrkne formulu).
vsego (napisa): | Zato sto si si nastimao za neki mali primjer (vjerojatno ovaj iz zadace) i ocekujes da radi i za vece.
Basically, tvoj program racuna [tex]zbr + 11zbr + 111zbr + \dots[/tex] (rekurzija ti za to uopce ne treba). Nemam nista protiv, ali dokazi (matematicki) zasto bi ta formula bila dobra.
Recimo, za brojeve 1, 2, 3:
[tex]1+2+3+12+13+21+23+31+32+123+132+213+231+312+321 = 1470[/tex],
a tebi ispada
[tex]1\cdot(1+2+3) + 11\cdot(1+2+3) + 111\cdot(1+2+3) = 738[/tex]. |
Hvala, nisam išao za tim.
Zapravo formula bi bila zbr +(n-1)*(11*zbr+111*zbr..).
Jesam u pravu? Ili na četveroznamenkastima ima još više kombnacija?
Kako bih onda rekurzijom trebao rješavati? Makar, ovo mi se čini daleko najjednostavnije i najbrže izbršeno (osim ako 'genijalac' kao ja ne zafrkne formulu).
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 10:17 sri, 17. 4. 2013 Naslov: |
|
|
Ne znam koja je formula niti ima li je (u nekom razumnom obliku). Ako tvrdis da je neka formula ispravna, zdravo je to dokazati. Znam da postoji nerekurzivno rjesenje, ali ne znam napamet koje je (a ne mozga mi se sad o tome).
Poanta zadatka je ionako da se vjezbaju rekurzije, no nitko ti nece prigovarati ako to uspjesno izbjegnes (kinda beats the purpose, ali isto se moze reci i za rjesavanje zadace nakon kolokvija za koji te ona priprema).
Ima jos jedan detalj koji bi mogao biti problem: rezultat moze biti solidno velik broj. Vjerojatno bi [tt]long[/tt] bio s(p)retniji izbor od [tt]int[/tt].
Sto se tice primjera za 4, ovo sam nabrzinu skucao u PERLu:
[code:1]$ perl -e '$br=1234;$br=join"",reverse sort split//,$br;$s=0;foreach$x(1..$br){next if$x=~/[^$br]/||$x=~/(.).*\1/;$s+=$x;}print"$s\n";'[/code:1]
U osnovi, kod kaze "trci od 1 do 4321, preskoci sve koji imaju znamenku razlicitu od 1,2,3, ili dvije iste znamenke, a ono sto ostane zbroji". Za 123 radi korektno, a cini mi se da je i za ovo ok, a tu vraca [b]73660[/b]. Tvoja formula bi vratila
[tex](1 + 2 + 3 + 4) + (4-1) \cdot (11 \cdot (1 + 2 + 3 + 4) + 111 \cdot (1 + 2 + 3 + 4) + 1111 \cdot (1 + 2 + 3 + 4)) = 37000[/tex].
Dakle, koju god formulu da koristis, ako ti ne radi, dokazi matematicki da bi trebala raditi, pa cemo onda traziti gresku u kodu. Ili jednostavno napisi korektnu rekurziju koja prolazi kroz sve takve brojeve.
Ne znam koja je formula niti ima li je (u nekom razumnom obliku). Ako tvrdis da je neka formula ispravna, zdravo je to dokazati. Znam da postoji nerekurzivno rjesenje, ali ne znam napamet koje je (a ne mozga mi se sad o tome).
Poanta zadatka je ionako da se vjezbaju rekurzije, no nitko ti nece prigovarati ako to uspjesno izbjegnes (kinda beats the purpose, ali isto se moze reci i za rjesavanje zadace nakon kolokvija za koji te ona priprema).
Ima jos jedan detalj koji bi mogao biti problem: rezultat moze biti solidno velik broj. Vjerojatno bi long bio s(p)retniji izbor od int.
Sto se tice primjera za 4, ovo sam nabrzinu skucao u PERLu:
Kod: | $ perl -e '$br=1234;$br=join"",reverse sort split//,$br;$s=0;foreach$x(1..$br){next if$x=~/[^$br]/||$x=~/(.).*\1/;$s+=$x;}print"$s\n";' |
U osnovi, kod kaze "trci od 1 do 4321, preskoci sve koji imaju znamenku razlicitu od 1,2,3, ili dvije iste znamenke, a ono sto ostane zbroji". Za 123 radi korektno, a cini mi se da je i za ovo ok, a tu vraca 73660. Tvoja formula bi vratila
[tex](1 + 2 + 3 + 4) + (4-1) \cdot (11 \cdot (1 + 2 + 3 + 4) + 111 \cdot (1 + 2 + 3 + 4) + 1111 \cdot (1 + 2 + 3 + 4)) = 37000[/tex].
Dakle, koju god formulu da koristis, ako ti ne radi, dokazi matematicki da bi trebala raditi, pa cemo onda traziti gresku u kodu. Ili jednostavno napisi korektnu rekurziju koja prolazi kroz sve takve brojeve.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
Vishykc Forumaš(ica)
Pridružen/a: 23. 10. 2010. (14:38:08) Postovi: (6A)16
Spol:
Lokacija: Zagreb
|
Postano: 22:37 sub, 27. 4. 2013 Naslov: |
|
|
Pozdrav, rijesavam sad ovo od prije :D Napišite program koji učitava prirodni broj n ≤ 17 i niz od n cijelih brojeva. Program treba kreirati donjetrokutastu matricu M reda n kojoj se učitani brojevi nalaze na dijagonali (redom kojim su učitani), a za elemente ispod dijagonale vrijedi:
Mi,j=(−3Mi−1,j−6Mi,j+1) mod 304195,
gdje mod označava nenegativni ostatak pri dijeljenju lijevog broja s desnim.
Program treba ispisati elemente posljednjeg retka matrice M (ispisane brojeve odvojite razmakom). Malo sam se igrao din. alokacijom visedim. polja pa me zanima jel tu greska ili to zbuni verifikatora. Ne mogu naci drugdje gresku: Hvala!
[code:1]#include <stdio.h>
#include <stdlib.h>
#define MOD 304195
int main(){
int n, **M, i, j, ostatak;
scanf("%d", &n);
M = (int **) malloc(n * sizeof(int *));
for(i = 0; i < n; ++i){
M[i] = (int *) malloc(n * sizeof(int));
}
for(i = 0; i < n; ++i) scanf("%d", &M[i][i]);
for(i = 0; i < n; ++i){
for(j = i - 1; j >= 0; --j){
ostatak = (M[i - 1][j] - 6 * M[i][j + 1]) % MOD;
while(ostatak < 0) ostatak += MOD;
M[i][j] = ostatak;
}
}
for(j = 0; j < n - 1; ++j) printf("%d ", M[n - 1][j]);
printf("%d", M[n - 1][n - 1]);
for(i = 0; i < n; ++i) free(M[i]);
free(M);
return 0;
}
[/code:1]
Pozdrav, rijesavam sad ovo od prije Napišite program koji učitava prirodni broj n ≤ 17 i niz od n cijelih brojeva. Program treba kreirati donjetrokutastu matricu M reda n kojoj se učitani brojevi nalaze na dijagonali (redom kojim su učitani), a za elemente ispod dijagonale vrijedi:
Mi,j=(−3Mi−1,j−6Mi,j+1) mod 304195,
gdje mod označava nenegativni ostatak pri dijeljenju lijevog broja s desnim.
Program treba ispisati elemente posljednjeg retka matrice M (ispisane brojeve odvojite razmakom). Malo sam se igrao din. alokacijom visedim. polja pa me zanima jel tu greska ili to zbuni verifikatora. Ne mogu naci drugdje gresku: Hvala!
Kod: | #include <stdio.h>
#include <stdlib.h>
#define MOD 304195
int main(){
int n, **M, i, j, ostatak;
scanf("%d", &n);
M = (int **) malloc(n * sizeof(int *));
for(i = 0; i < n; ++i){
M[i] = (int *) malloc(n * sizeof(int));
}
for(i = 0; i < n; ++i) scanf("%d", &M[i][i]);
for(i = 0; i < n; ++i){
for(j = i - 1; j >= 0; --j){
ostatak = (M[i - 1][j] - 6 * M[i][j + 1]) % MOD;
while(ostatak < 0) ostatak += MOD;
M[i][j] = ostatak;
}
}
for(j = 0; j < n - 1; ++j) printf("%d ", M[n - 1][j]);
printf("%d", M[n - 1][n - 1]);
for(i = 0; i < n; ++i) free(M[i]);
free(M);
return 0;
}
|
_________________ U matematici se sve smije, osim pogriješiti!
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
Gino Forumaš(ica)
Pridružen/a: 11. 09. 2008. (10:54:06) Postovi: (370)16
Lokacija: Pula
|
|
[Vrh] |
|
Vishykc Forumaš(ica)
Pridružen/a: 23. 10. 2010. (14:38:08) Postovi: (6A)16
Spol:
Lokacija: Zagreb
|
|
[Vrh] |
|
Silenoz Forumaš(ica)
Pridružen/a: 15. 10. 2011. (18:45:11) Postovi: (4F)16
Spol:
|
Postano: 22:04 ned, 28. 4. 2013 Naslov: |
|
|
[quote="Gino"]Nije ti greska u alokaciji.
ostatak = (M[i - 1][j] - 6 * M[i][j + 1]) % MOD;
U ovoj formuli gore, fali *(-3) na prvi clan, ukoliko si u tekstu prije napisao dobru formulu.
Sto se tice ovoga:
while(ostatak < 0) ostatak += MOD;
ja bih to ipak napravio prije uzimanja modula (dakle, maknuo bih onaj %MOD gore, napravio taj while i onda uzeo MOD)..[/quote]
Ako to napraviš prije modula onda ti ni ne treba modul, jer ćeš odmah dobiti ostatak dijeljenja. Ali to je sporija opcija jer ko zna koliko oduzimanja može raditi.
Gino (napisa): | Nije ti greska u alokaciji.
ostatak = (M[i - 1][j] - 6 * M[i][j + 1]) % MOD;
U ovoj formuli gore, fali *(-3) na prvi clan, ukoliko si u tekstu prije napisao dobru formulu.
Sto se tice ovoga:
while(ostatak < 0) ostatak += MOD;
ja bih to ipak napravio prije uzimanja modula (dakle, maknuo bih onaj %MOD gore, napravio taj while i onda uzeo MOD).. |
Ako to napraviš prije modula onda ti ni ne treba modul, jer ćeš odmah dobiti ostatak dijeljenja. Ali to je sporija opcija jer ko zna koliko oduzimanja može raditi.
|
|
[Vrh] |
|
|