Kod: |
int potbr2(int i)
{ int vr=1, t=i; while (t>0) {if (t%2==0 || t==1) t/=2; else {vr=0; break;}} if (i==0) vr=0; return vr; } int main(void) { int n; printf ("Unesi broj clanova niza: "); scanf ("%d", &n); int a[n]; int i, j, brojac=0; printf ("Niz?: "); for (i=0; i<n; i++) scanf ("%d", &a[i]); for (i=1; i<n; i++) { if (potbr2(i)) {for (j=i; j<n; j++) a[j]=a[j+1]; brojac++; i++;} } n-=brojac; for (i=0; i<n; i++) printf ("%d ", a[i]); return 0; } |
krilo (napisa): | ||
|
Citat: |
Palo mi je napamet početi brisati od zadnjeg člana |
Citat: |
ali onda ne znam što na njegovo mjesto staviti |
Citat: |
Imam funkciju za prepoznavanje je li indeks potencija broja dva |
Spoiler : |
Citat: | ||
|
Citat: |
Moglo bi ti odnijeti bodove na kolokviju. |
Citat: |
Pomakni sve članove koji se nalaze desno od onoga koji brišeš za jedno mjesto ulijevo. |
Citat: |
Zašto ti treba varijabla t? |
krilo (napisa): | ||
|
Citat: | ||
|
Citat: | ||
|
Kod: |
int potbr2(int i)
{ int vr=1; if (i==0) vr=0; while (i>0) {if (i%2==0 || i==1) i/=2; else {vr=0; break;}} return vr; } |
Kod: |
int potbr2(int i)
{ if (i==0) return 0; while (i>0) {if (i%2==0 || i==1) i/=2; else return 0;} return 1; } |
Citat: |
za ovaj tvoj kod nisam baš ganz sicher... Za duljinu niza unesem 10 i brojeve od 0-9, a on izbaci 0, 3, 3, 3, 5, 5 iako bi trebao maknuti samo 1, 2, 4 i 8. |
Kod: |
[mdoko@bajdo]/tmp$ cat proba.c
#include <stdio.h> int main() { int niz[1719]; int n, d, i; int broj_obrisanih; printf("Duljina niza: "); scanf("%d", &n); for(i = 0; i < n; ++i) { printf("niz[%d] = ", i); scanf("%d", &niz[i]); } /* Trazimo najvecu potenciju od 2 koja je indeks u nasem nizu. */ d = 1; /* ovo je 2^0 */ while(d < n) { /* indeksi u nizu idu od 0 do n-1 */ d = d * 2; } d = d / 2; /* Gornjom petljom smo izletili iz niza, pa se moramo vratiti jedan korak unatrag */ /* Brisanje "nezeljenih" clanova niza i brojanje koliko smo ih obrisali.*/ broj_obrisanih = 0; while(d > 0) { /* Pocevsi od indeksa d+1, pomicemo sve clanove niza za jedno mjesto ulijevo. */ for(i = d + 1; i < n; ++i) { niz[i-1] = niz[i]; } broj_obrisanih = broj_obrisanih + 1; /* Sad kad smo se rijesili elelmenta na poziciji d, mozemo krenuti brisati sljedeci element. */ d = d / 2; } /* Na kraju ispisemo novonastali niz. Duljina novig niza je (n - broj_obrisanih). */ for(i = 0; i < n - broj_obrisanih; ++i) { printf("%d ", niz[i]); } return 0; } [mdoko@bajdo]/tmp$ gcc -o proba -O1 -std=c89 -pedantic-errors -Wall -Wextra -Wno-unused-result proba.c [mdoko@bajdo]/tmp$ ./proba Duljina niza: 10 niz[0] = 0 niz[1] = 1 niz[2] = 2 niz[3] = 3 niz[4] = 4 niz[5] = 5 niz[6] = 6 niz[7] = 7 niz[8] = 8 niz[9] = 9 0 3 5 6 7 9 |
krilo (napisa): |
Copy-pasteala sam ovaj drugi kod, ali mi compiler izbaci na liniji int niz[1719] obavijest error: stray \240 i odbija kompajliranje... Kaj bi to točno trebalo značit? (Čisto informativno.) |
Kod: |
void prebroji (char a[], int n, int *krizic, int *kruzic, int *igre)
{ *krizic=0; *kruzic=0; *igre=-1; int i; for (i=0; i<n; i++) { if (a[i]=='o') (*kruzic)++; if (a[i]=='!') (*igre)++; if (a[i]=='x') (*krizic)++; } } void igra(char a[], int n) { int i, j, s, r; for (i=0; i<n;) { for (j=i+1; j; j++) {if (a[j]=='!') break;} int krizic=0, kruzic=0, igre=0, k; for (k=i+1; k<j; k++) { if (a[k]=='o') (kruzic)++; if (a[k]=='x') (krizic)++; } if(krizic>kruzic) {for(s=i+1; s<j; s++) a[s]='x';} if(kruzic>krizic) {for(s=i+1; s<j; s++) a[s]='o';} i=j; } for (i=0; i<n; i++) printf ("%c", a[i]); } int main(void) { char a[20]; int i, n, krizic, kruzic, igre; printf ("Duljina niza? "); scanf ("%d", &n); printf ("Niz? "); for (i=0; i<n; i++) scanf (" %c", &a[i]); prebroji(a,n,&krizic,&kruzic,&igre); printf ("Krizica: %d\nKruzica: %d\nIgara: %d\n", krizic, kruzic, igre); igra(a,n); return 0; } |
krilo (napisa): |
Probala sam valjda petsto puta s međuispisima, ali jednostavno ne mogu naći razlog zašto se petlja s j, kad je i najveći mogući, vrti u nedogled. |
Mala_022 (napisa): | ||
Samo ukratko (dok ne dođe mdoko ) - kad je i najveći mogući (i=n-1), onda je j=i+1=n, a ne znamo šta je a[n] (i onda još u petlji povećavaš j bez provjeravanja dokle uopće može ići). |
krilo (napisa): |
Generalno, algoritam je ovakav: jot je indeks prvog sljedećeg uskličnika, pa se prema omjeru križića i kružića situacija mijenja u "ogradi". Poslije mijenjanja, i postaje jot i isti se postupak dalje nastavlja.
Poanta je u tome da i nije jednak n-1 (barem ne u testnom primjeru). Tu bi zadnji mogući i trebao biti na 8. mjestu (na trećem uskličniku), pa bi j (sljedeći nađeni uskličnik) trebao biti na 12 mjestu. Na kraju for-petlje imamo i=j, a kako je j=12 trebala bi se for-petlja uredno prekinuti. (Tako da se ne bi desio slučaj j=n.) Ispravite me ako griješim, al stvarno ne znam di griješim |
krilo (napisa): | ||
|
output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.