• 31 odgovora
  • 28.858 pregleda
Najkraći C program za računajje broja pi 20.04.2004. u 23:43 · pre 274 meseci #1
Čisto da se zna.


Na adresi http://numbers.computation.fre...ts/TinyPrograms/tinycodes.html nalaze se najkraći poznati programi na jeziku C za računanje broja pi na veliki broj decimalnih mesta. Takođe, traže da im se obrati svako ko ima kraći kod. Njihov najkraći kod glasi

Code:

long k=4e3,p,a[337],q,t=1e3;
main(j){for(;a[j=q=0]+=2,--k;)
for(p=1+2*k;j<337;q=a[j]*k+q%p*t,a[j++]=q/p)
k!=j>2?:printf("%.3d",a[j-2]%t+q/p/t);}


i ja sam uspeo da ga skratim za jedan znak zamenjujući izraz k!=j>2 izrazom j>2<k koji je sa njim ekvivalentan pod uslovom da k nije manje od 1, a taj uslov je u ovom programu uvek ispunjen, jer se vrednost promenljive k smanjuje od 4000 do 0 za po jedan pri čemu program završava rad kada k postane 0, tako da se izraz k!=j>2 izračunava samo kada je k>=1. No, bez obzira na sve to, kao i na činjenicu da oba koda proizvode isti rezultat (programi su testirani), i pored toga što sam im poslao poboljšani kod, oni se i dalje prave ludi! Tek toliko da se zna.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Najkraći C program za računajje broja pi 10.07.2004. u 10:43 · pre 271 meseci #2
Nedeljko, prevideo si da se
Code:
for(;a[j=q=0]+=2,--k;)
moze zameniti sa
Code:
for(;--k;a[j=q=0]=2)
cime se program skracuje za dodatna dva karaktera. Verujem da postoje i dodatna poboljsanja.
Potpis
O_o
Re: Najkraći C program za računajje broja pi 13.07.2004. u 01:42 · pre 271 meseci #3
nešto slično na http://www1.physik.tu-muenchen...tpack/html/Mathematics/Pi.html

Code:
/* Calculation of pi to 16276 decimal digits */
/* Size of program: 143 characters */
/* After Dik T. Winter, CWI Amsterdam */
int a=1e4,b,c=56980,d,e,f[56980],g,h,i;
main(){for(;b=c,c-=14;i=printf("%04d",e+d/a),e=d%a)
while(g=--b*2)d=h*b+a*(i?f[b]:a/5),h=d/--g,f[b]=d%g;}


i još kraći za e:

Code:
/*[email protected]*/int a[3302],b=3301,*c=a,d,e,f;main(){for(e=b;--e;*c++=1);*c
=2;for(d=2001;d--;printf("%05d",f))for(c=a,e=b;e;f/=e--){f+=*c*1e5;*c++=f%e;}}
Potpis
blogče :: unescaped beta
  »
go-paste extenzija
  »
reč dana: backup
  »
bočne koalicije
Re: Najkraći C program za računajje broja pi 17.08.2004. u 16:27 · pre 270 meseci #4
Inače nisam napisao da programi koje sam priložio imaju jednu sitnu anomaliju koja se može pojaviti kod serija od šest i više uzastopnih devetki, ali koja se ne ispoljava među prvih hiljadu decimala. Blažina, kao i moja korekcija nemaju nikakvog uticaja na to. Sve verzije tog koda imaju isti nedostatak. Inače, analizom programa se može utvrditi da je zasnovan na Ojlerovoj transformaciji Lajbnicovig reda (razvoja za arctg u tački 1).
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Najkraći C program za računajje broja pi 18.08.2004. u 14:35 · pre 270 meseci #7
Jedan od kracih progama za izracunavanje broja Pi moze se naci u attachment-u (kompajlirana vezija i sors kod). Program je pisan u x86 asembleru, i izracunava 9300+ tacnih decimala broja Pi. Duzina kompajliranog programa (DOS .COM fajl) iznosi 110 bajtova.
Potpis
O_o
Re: Najkraći C program za računajje broja pi 18.08.2004. u 17:36 · pre 270 meseci #8
Da, samo to nije C program. To rešenje spada u kategoriju asemblerskih rešenja i u njoj je izuzetno optimalno. Svuda gde se prilažu takvi programi, oni se razvrstavaju u zasebne kategorije prema jezicima u kojima su pisani.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Najkraći C program za računajje broja pi 26.12.2004. u 18:14 · pre 265 meseci #9
What's the big deal?
Dik T. Winter se nije narocito potrudio da skrati kod.
Skratio sam njegov program za 9 znakova (143 -> 134).
Code:
int a=1e4,c=56980,d,e,f[56980],g,h;
main(b){for(;b=c-=14;printf("%04d",e+d/a))for(e=d%a;g=2*--b;h=d/--g,f[b]=d%g)d=h*b+a*(e?f[b]:2e3);}
Potpis
O_o
Re: Najkraći C program za računajje broja pi 04.01.2005. u 12:18 · pre 265 meseci #11
A ko je tvrdio da je službena? Dobro de, svuda fali jedno #include <stdio.h>
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Najkraći C program za računajje broja pi 24.10.2007. u 21:30 · pre 231 meseci #13
Citat:
sallle: onda treba optimizovati i taj heder, i izbaciti nepotrebne stvari...

u prevodu , minimalizam C-a ;)
Potpis
<kow> "There are 10 types of people in the world... those who understand binary and
those who don't."
<SpaceRain> That's only 2 types of people, kow.
<SpaceRain> STUPID
Re: Najkraći C program za računajje broja pi 24.10.2007. u 21:48 · pre 231 meseci #14
Citat:
blaza: What's the big deal?
Dik T. Winter se nije narocito potrudio da skrati kod.
Skratio sam njegov program za 9 znakova (143 -> 134).
Code:
int a=1e4,c=56980,d,e,f[56980],g,h;
main(b){for(;b=c-=14;printf("d",e+d/a))for(e=d%a;g=2*--b;h=d/--g,f[b]=d%g)d=h*b+a*(e?f[b]:2e3);}


Hm, ako se ne varam, na poslednjoj liniji nije potrebno ; na kraju, ako vec ide }. Eto jos jednog znaka ;]
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Najkraći C program za računajje broja pi 24.10.2007. u 22:01 · pre 231 meseci #15
Citat:

Hm, ako se ne varam, na poslednjoj liniji nije potrebno ; na kraju, ako vec ide }

Mora ;) Pomesao si sa Pascal-om, gde nesto slicno moze...
C/C++ su rigorozni po tom pitanju.
Čak mora i iza prazne "default:" konstrukcije unutar switch, neposredno pre }.

Dalje, u izrazima:
if ( nesto )
x=1;
else
x=2;
... opet mora ; cak i iza x=1, za razliku od Pascala.

EDIT / Off Topic

Jedino se ; ne stavlja iz kraja bloka } sem u posebnim slucajevima (koji doduse i nisu tako retki) kada sintaksa konstrukcije nalaze. Na primer:
class NekaKlasa {};
Ovde treba ; jer moze da postoji i izraz:
class NekaKlasa {} Objekat;
... kojim se odmah kreira i objekat.

To je inace jedna od gresaka koju pocetnici tesko uspevaju da lociraju i otklone, jer se greska obicno prijavi u DRUGOM izvornom fajlu projekta, zbog strukture C/C++ programa (zaglavlje/izvorni kod):

--- fajl.H ---
class Klasa {}
--- fajl.CPP ---
#include "fajl.H"
int i=10;

... gore u H nedostaje ; iza } a greska se obicno javi u CPP fajlu :)



[Ovu poruku je menjao X Files dana 24.10.2007. u 23:26 GMT+1]
Re: Najkraći C program za računajje broja pi 15.01.2009. u 19:44 · pre 216 meseci #16
Idemo dalje: 134 -> 127.

Code:
a=1e4,c=56980,d,e,f[56980],g;main(b){for(;b=c-=14;printf("%04d",e+d/a))for(e=d%a;g=2*--b;d+=e?f[b]*a:2e7,f[b]=d%--g,d/=g)d*=b;}


[Ovu poruku je menjao blaza dana 16.01.2009. u 00:18 GMT+1]
Potpis
O_o
Re: Najkraći C program za računajje broja pi 18.01.2009. u 12:02 · pre 216 meseci #17
Ne moze krace?

Moze ;)

Nova skracenja:

123 karaktera, 16275 tacnih decimala
Code:
a=1e4,c=113932,d,e,f[113960];main(g){for(;g=c-=28;printf("%04d",e%a+d/a))for(e=d;g;d/=g--)d*=g--/2,f[g]=d+=e?f[g]%g*a:2e7;}


121 karakter, 9999 tacnih decimala
Code:
a=1e4,c=70028,d,e,f[70000];main(g){for(;g=c-=28;printf("%04d",e%a+d/a))for(e=d;g;d/=g--)d*=g--/2,f[g]=d+=e?f[g]%g*a:2e7;}


119 karaktera, 999 tacnih decimala
Code:
a=1e4,c=7028,d,e,f[7000];main(g){for(;g=c-=28;printf("%04d",e%a+d/a))for(e=d;g;d/=g--)d*=g--/2,f[g]=d+=e?f[g]%g*a:2e7;}



[Ovu poruku je menjao blaza dana 18.01.2009. u 19:41 GMT+1]
Potpis
O_o
Re: Najkraći C program za računajje broja pi 27.03.2010. u 22:47 · pre 201 meseci #18
Citat:
Nedeljko: Inače nisam napisao da programi koje sam priložio imaju jednu sitnu anomaliju koja se može pojaviti kod serija od šest i više uzastopnih devetki, ali koja se ne ispoljava među prvih hiljadu decimala.


Kolega, niste dobro naučili matematiku. Ovde nema nikakve anomalije, program je potpuno čist.

Kod u čitljivijoj varijanti izgleda ovako:

Code:
#include <stdio.h>

int main()
{
    int a[337], t = 1000, k;

    printf("3.");

    for (k = 4000; k > 0; k--) {
        int p = 2*k + 1;
        int q = 0;
        int j;

        a[0] += 2;

        for (j=0; j<337; j++) {
            if (k == 1 && j > 2) {
                printf("%.3d", a[j-2]%t + q/p/t);
            }

            q = a[j]*k + q%p*t;
            a[j] = q/p;
        }
    }

    printf("\n");

    return 0;
}
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Najkraći C program za računajje broja pi 29.03.2010. u 09:17 · pre 201 meseci #20
Citat:
Nedeljko: Kolega, niste dobro naučili matematiku. Ovde nema nikakve anomalije, program je potpuno čist.


Kolega, Vi niste dobro naučili matematiku! Program ima anomaliju o kojoj ću nešto napisati kasnije.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme