Skracanie Kodu - C

0

Witam,
Ostatnio robiłem zadanie ze spoja ( dokładniej suman ).
Chodzi o napisanie jak najkrótszego kodu.
Ja napisałem w C na 63 znaki i nie wiem w jaki sposób mogę zejść niżej.

main(n){while(scanf("%d",&n)>0)printf("%d ",n*n+n>>1);exit(0);} 

Chodzi tu chyba o skrócenie "exit(0);" :)
Mógłby mi ktoś pomóc ?
Pozdrawiam,
Zabytek

0

A ten exit to tam jest bo?

0

Exit(0) jest, bo inaczej program nie zwraca 0. Jest to krótsze niż return(0), a zwrócenie 0 jest wymagane :)

0

Mi i bez tego działa.

0

Jasne że program zadziała, problem w tym że SPOJ sprawdza kod zwrócony przez program i jeśli != 0 to nie zalicza. Chyba że wysłałeś... Zakładając normalną pracę kompilatora, scanf musiałoby zwrócić 0.

0

mozesz skasowac jeszcze >0, kazda liczba !=0 jest traktowana jako true. podobno ludzie umieja zapis n*n+n>>1 zapisac o jeden znak krocej ale za cholere nie mam pojecia jak

0

54

main(a){while(~scanf("%d",&a))printf("%d ",a+a*a>>1);}
0

Dzięki wielkie.
Jeszcze tylko jeden znak i maksymalna liczba punktów :)
Wie ktoś co trzeba zmienić ?
Wytłumaczycie mi skąd wzięła się negacja bitowa w warunku scanfa ?
Pozdrawiam,
Zabytek32

0

funkcja scanf w przypadku napotkania końca pliku zwraca EOF ("koniec pliku"), która to wartość jest liczbą ujemną. W przypadku większości kompilatorów, w tym używanego przez SPOJ-a, ma on wartość -1: http://ideone.com/3TBJc .
Popatrz na używany przez PC kod uzupełnień do 2 (U2). Tam wartość -1 jest zapisana w formacie binarnym jako ciąg jedynek (w formacie hexowym 0xFFFFFFFF). Negacja zamienia każdą jedynkę na przeciwieństwo - zero, czyli wartość wyniesie w hexach 0x00000000 = zero.
Wynik operacji, zanim jest zapisany do zmiennej lub sprawdzony, najczęściej jest obliczany do rejestru procesora EAX. Zarazem EAX przechowuje wynik funkcji (czyli po prostu to, co uzyskamy z return cośtam;), a ponieważ ostatnio zostało ustawione EAX=0, to wszystko działa OK.

0

Wpadłem ostatnio na pomysł co jeszcze można skrócić w moim kodzie.
printf("%d ",a+a*a>>1);
Można to skrócić o dokładnie jeden znak używając zmiennej tylko 2 razy.
Mógłby mi ktoś w tym pomóc ?
Pozdrawiam,
Zabytek

0

1 to chyba to samo co /2, czyż nie?

Edit:
OK, wypadło mi z głowy pierwszeństwo operatorów.

    for (int32_t a = 1; a <= 10; a++) {
        printf("%d\n", a+a*a>>1);
        printf("%d\n", a*~a/-2);
    }
0
Wibowit napisał(a)

czyż nie?

Oczywiście, o ile masz w dupie różne priorytety operatorów, które zmieniają całkowicie przebieg obliczeń.

0

Tak na szybko:

main(n){~scanf("%d",&n)&&printf("%d ",n*~n/-2)&main();}

Jutro może jeszcze spróbuję to poprawić żeby uzyskać te 53 znaki.

0

Raczej w złą stronę idziesz.

53 znaki:

main(a){while(~scanf("%d",&a))printf("%d ",a*~a/-2);}

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