Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Jednostavni Algoritam

[es] :: Art of Programming :: Jednostavni Algoritam

Strane: 1 2

[ Pregleda: 5883 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2790 Profil

icon Re: Jednostavni Algoritam08.07.2008. u 16:48 - pre 192 meseci
Zaboravih da napomenem da znak "/" označava uobičajeno delenje realnih brojeva. Prethodni zadatak razmotrimo u realnoj aritmetici da ne bi došlo do C-ovskog celobrojnog delenja, što je nešto drugo.

Šta nam omogućavaju izračunati polinomi ? Ako je bilo koji polinom, onda možemo izračunati . Zaista, za ma koje brojeve važi .

U petlji

Code:

for (j=1; j<=s0; j=j+1)
{
    s = s+n*j+(i+j)*s0*s0+(i+j)*s0*((i+j)*s0+1)/2;
}


izraz (s0) koji predstavlja granicu indeksa se ne menja. Pošto je n*j+(i+j)*s0*s0+(i+j)*s0*((i+j)*s0+1)/2=(s0*s0/2)*j*j+(n+s0*s0+i*s0+s0/2)*j+(i*s0*s0+(i*i*s0*s0+i*s0)/2), prethodna petlja je ekvivalentna petlji

Code:

for (j=1; j<=s0; j=j+1)
{
    s = s+(s0*s0/2)*j*j+(n+s0*s0+i*s0+s0/2)*j+(i*s0*s0+(i*i*s0*s0+i*s0)/2);
}


Posto se u petlji vrednosti promenljivih s0,n,i ne menjaju, ovaj kod će biti ekvivalentan naredbi

Code:

s = s+(s0*s0/2)*(2*s0+1)*(s0+1)*s0/6+(n+s0*s0+i*s0+s0/2)*(s0+1)*s0/2+(i*s0*s0+(i*i*s0*s0+i*s0)/2)*s0;


Dakle, program je ekvivalentan sa

Code:

#include <iostream>

using namespace std;

int main()
{
    int i,j,k,n,s,s0;

    cout << "Unesi prirodan broj " << flush;
    cin >> n;
    s = 0;
    s0 = 0;

    for (i=1; i<=n ; i=i+1)
    {
        s = s + n;
        s0 = s0 + n;
        s = s+(s0*s0/2)*(2*s0+1)*(s0+1)*s0/6+(n+s0*s0+i*s0+s0/2)*(s0+1)*s0/2+(i*s0*s0+(i*i*s0*s0+i*s0)/2)*s0;
    }

    cout << "Rezultat je " << s << endl;

    return 0;
}


odnosno sa

Code:

#include <iostream>

using namespace std;

int main()
{
    int i,j,k,n,s,s0;

    cout << "Unesi prirodan broj " << flush;
    cin >> n;
    s = 0;
    s0 = 0;

    for (i=1; i<=n ; i=i+1)
    {
        s0 = s0 + n;
        s = s+n+(s0*s0/2)*(2*s0+1)*(s0+1)*s0/6+(n+s0*s0+i*s0+s0/2)*(s0+1)*s0/2+(i*s0*s0+(i*i*s0*s0+i*s0)/2)*s0;
    }

    cout << "Rezultat je " << s << endl;

    return 0;
}


U originalnom programu je bila štamparska greška. Pisalo je s0 = s + n umesto s0 = s0 + n. Sada je to ispravljeno.
Primetimo da izračunavanje s0 nije zavisno od izračunavanja s. Odatle se lako zaključuje da je zapravo s0=i*n. Stoga je program ekvivalentan programu


Code:

#include <iostream>

using namespace std;

int main()
{
    int i,j,k,n,s,s0;

    cout << "Unesi prirodan broj " << flush;
    cin >> n;
    s = 0;
    s0 = 0;

    for (i=1; i<=n ; i=i+1)
    {
        s = s+n+(i*n*i*n/2)*(2*i*n+1)*(i*n+1)*i*n/6+(n+i*n*i*n+i*i*n+i*n/2)*(i*n+1)*i*n/2+(i*i*n*i*n+(i*i*i*n*i*n+i*i*n)/2)*i*n;
    }

    cout << "Rezultat je " << s << endl;

    return 0;
}


Pošto je n+(i*n*i*n/2)*(2*i*n+1)*(i*n+1)*i*n/6+(n+i*n*i*n+i*i*n+s0/2)*(s0+1)*s0/2+(i*i*n*i*n+(i*i*i*n*i*n+i*i*n)/2)*i*n polinom po i, a pritom je dat i postupak za svođenje ovakvog zadatka na funkcije, za koje je dat postupak računanja, mogao bi neko da dokusuri ovaj zadatak.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2790 Profil

icon Re: Jednostavni Algoritam08.07.2008. u 16:54 - pre 192 meseci
Prethodni polinom po i je stepena 5, pa je konačan rezultat polinom po n stepena 6. Ako neko želi da ga računa pomoću nekog gotovog matematičkog softvera, može ga izračunati tako što će odrediti vrednost funkcije (neposrednim računanjem) u 7 tačaka, pa onda provući interpolacioni polinom (ako ima softver sa podrškom za interpolacione polinome).
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: Art of Programming :: Jednostavni Algoritam

Strane: 1 2

[ Pregleda: 5883 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.