Skrócenie kodu

2011-10-25 21:38
gubbi
0
int main(){
    int nr, j=4, i;
    bool arry[10000];
    scanf("%d", &nr);
    for(i=2; i <= ceil(sqrt(nr)); i++, j=i+i){
            if(!arry[i]){
                           while(j<nr){
                                        arry[j]=1;
                                        j+=i;
                           }
            }
    } 
    for (i=2; i<nr; i++) if (arry[i]==0) printf("%d, ",i);
}

Ktoś jest w stanie wykombinować krótszy kod? Nie mam już pomysłu jak skrócić kod :/
Za pomoc dziękuję!

Pozostało 580 znaków

2011-10-25 21:59
0

po co deklarujesz i (2) jak potem w linijce (5) znowu deklarujesz lokalną i??? Pierwszej wogóle nie używasz bo cała funkcja int to deklaracje i pętla for. Po drugie czego tag c++? Nie wiedzałem że w c++ używa się scanf ROTFL.


"Home is where the Wi-Fi is" - Dalai Lama
Pokaż pozostałe 22 komentarze
Po 1 to nie ten dział, a po drugie sorry Janek ale o C/C++ też masz niewielkie pojęcie wnioskując po tym co piszesz na temat powyższego kodu - stalk3r 2011-10-25 23:32
boże... jakie Ty bzdury wypisujesz Janek... poczytaj najpierw o javie i c++, bo i w poście i w komentarzach piszesz po prostu nieprawdę - byku_guzio 2011-10-25 23:40
gdzie bo nie widzę dalej???? - Janek566 2011-10-26 11:41
w 5 linijce nie ma żadnej deklaracji i, nigdzie nie ma też przesłonięcia tego "pierwszego" i - byku_guzio 2011-10-26 14:38
aa już widze on 2 niezależne pętle for używa dlatego nie deklaruje i w pętli tylko w main scope LOL - Janek566 2011-10-26 15:44

Pozostało 580 znaków

2011-10-25 22:30
0

for (i=2; i<nr; i++) if (arry[i]==0) printf("%d, ",i);

Po tym widzę, że masz straszne parcie, żeby kod zajmował mniej linii

Możesz napewno pozbyć się dwóch klamer przy for i przy if. Poza tym, możesz tak jak już uczyniłeś w ostatniej linijce umieścić wszystko w jednej linii.

Możesz również skorzystać zamiast z ifa z wyrażenia ?:


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2011-10-25 22:37
1

Po co skracać kod? Krótszy kod jest lepszy? Lecą na to laski?

Usunięcie { czy pakowanie wszystkiego do jednej linii przyśpiesza wykonanie?


"(...) otherwise, the behavior is undefined".
edytowany 2x, ostatnio: Endrju, 2011-10-25 22:38

Pozostało 580 znaków

2011-10-25 22:55
gubbi
0

Na to lecą nie tylko laski...

while(j<nr){
                      arry[j]=1;
                      j+=i;
}

zastanawiam się jak skrócić tą pętelkę? Nikt nie ma pomysłu.. :/

Pozostało 580 znaków

2011-10-25 23:09
0
#include <cmath>
#include <cstdio>
#include <cstring>

int main() {
    int nr;
    scanf("%d", &nr);
    unsigned char arry[nr];
    memset(arry, 0, nr);
    for (int i = 2, limit = ceil(sqrt(nr)); i < limit; i++) {
        if (!arry[i]) {
            for (int j = i * 2; j < nr; j += i) {
                arry[j] = 1;
            }
        }
    }
    for (int i = 2; i < nr; i++) {
        if (arry[i] == 0) {
            printf("%d, ", i);
        }
    }
}

Pewnie mnie ktoś zjedzie za używanie VLA, ale mam takich ludzi w D. VLA FTW!


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2011-10-25 23:12
Jak chcesz VLA to tylko C99, więc nagłówki do zmiany - stalk3r 2011-10-25 23:39
VLA jest w G++, więc jest OK dla mnie i nie przejmuję się VS, ICC i innymi :D - Wibowit 2011-10-25 23:41
wg standardu nie musi być - stalk3r 2011-10-25 23:44

Pozostało 580 znaków

2011-10-25 23:30
gubbi
0

Dzięki Wibowit! :)

Jakbyś skrócił poniższą funkcję

void prime_factor(int p, int i){
  for(i = 2; i <= (int)sqrt(p); i++)
  {
    while(!(p % i))
    {
      cout << i << " ";
      p /= i;
    }
    if(p == 1) break;
  }
  if(p > 1) cout << p;
}

Pozostało 580 znaków

2011-10-25 23:48
gubbi
0

okay, udało mi się skrócić, jeszcze raz dzięki za pomoc! :)

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0