algorytm do 1^3 + 2^3 + ... + n^3

0

Dlaczego nie wychodzi. Dla n=3 pokazuje sumę: 738?

#include <stdio.h>

int main()
{
int n, i, suma, a;
printf("Podaj liczbe naturalna: \n");
scanf("%d", &n);

suma=0;
a=1;

for(i=1; i<=n; ++i)
{
    a=a*a*a;
    suma=suma+a;
    a++;
}

printf("Suma szecianow wynosi: %d", suma);

}

1

Nigdzie nie resetujesz a więc po 2 iteracji, twoje a=8 w 3 już masz a=9*9*9=729 (bo na końcu dodajesz +1). Więc sumując z pierwszego suma=1, w drugim suma=9 w trzecim suma=738.

1

Czy ktoś może podpowiedzieć?

Zmień tę linię na, a = i * i * i;, i wywal, a++;.

2

Po co ci zmienna a? Przecież już iterujesz po i i możesz zrobić tak:

suma = suma + (i * i * i)
0

Tu lepiej widać
Czy ktoś wie gdzie jest różnica w poniższym? Pierwszy źle liczy, drugi liczy dobrze. Mi wydaje się, że to jest jedno i to samo, ale czymś się to musi różnić
for(i=1; i<=n; ++i)
{
i=iii;
suma=suma+i;
}

for(i=1; i<=n; ++i)
suma+=iii;
printf("S(%d) = %d", n,suma);

0

widzę, że ten kod się niewyraźnie wkleja

for(i=1; i<=n; ++i)
{
i=iii;
suma=suma+i;
}

for(i=1; i<=n; ++i)
suma+=iii;
printf("S(%d) = %d", n,suma);

0
for(i=1; i<=n; ++i)
    
    {
        i=i*i*i;
        suma=suma+i;
    }

  for(i=1; i<=n; ++i)
    suma+=i*i*i;
    printf("S(%d) = %d", n,suma);
1

Z tego samego powodu, dla którego pierwszy kod nie działał.

0
Jeśli ktoś wiedziałby czy dobrze myślę w poniższym, to będę wdzięczny za wyjaśnienie.

Chyba rozumiem, ale nie jestem pewien. W 1 kodzie i w pętli ma nadaną wartość =1, następnie w nawiasach i=i*i*i , suma wynosi 1, następnie ++i zwiększa i do 2, w nawiasach i=i*i*i, czyli i = 8, suma wynosi 9, następnie ++i zwiększa i o 1 do 10? Czy to o to chodzi? W drugim kodzie i zwiększa się cały czas tylko o 1. Tylko zastanawia mnie dlaczego w 1 kodzie pokazuje w wyniku 9, przy n 3. Tego nie rozumiem, jak komputer to liczy?```
1

Nie masz debuggera, żeby podejrzeć co tam sie dzieje? Na kartce, jeśli rozumiesz składnię pętli, for też to możesz rozpisać.

1
printf("%d\n", (n*n*(1 + n*(2 + n)))/4);

to powinno działać

1

@Karol321:

Nigdy go nie używałem. Teraz odpaliłem online, ale nie pokazuje żadnych błędów

Bo tam nie ma błędu, program działa inaczej niż planowałeś, a pod debugerem zobaczysz co się dzieje.

1

No w skrócie:
robisz

a = 1;
for (int i = 1; i <= n; ++i) {
    a = a*a*a;
    suma = suma+a;
    a++;
}

czyli najpierw dodajesz do sumy sześcian 1, w następnym obrocie dodajesz sześcian dwójki, a w kolejnym dodajesz już sześcian 9, czyli 729 (bo zrobiłeś w efekcie a = a*a*a+1 zamiast a = a+1 (ale i tak a nie jest tutaj potrzebne).

0
Chyba z powyższych wyjaśnień rozumiem dlaczego kod 1 działa źle. Bo i się zwiększa w nawiasach, czyli: zaczyna się jak i=1, później w nawiasach i=1, suma=1, i++ zwiększa i do 2, zaczyna się druga pętla, w nawiasach i =2*2*2=8, suma = 8+1, czyli 9, następnie i++ zwiększa i do 9 (bo 8+1), i w nawiasach i=9*9*9, ale to już będzie znacznie więcej niż pokazuje kompilator. 
Kompilator przy n=3 pokazuje mi przy pierwszym kodzie wynik 9. I tego nie rozumiem. Przy okazji też czy dobrze myślę rozpisując powyżej?

KOD1: 

for(i=1;i<=n; ++i)

    {
        i=i*i*i;
        suma=suma+i;
    }
KOD2: 

  for(i=1; i<=n; ++i)
    suma+=i*i*i;
    printf("S(%d) = %d", n,suma);```
0

Dziękuję wszystkim za wyjaśnienia :)

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