[C] Program rozwiązujący pewną nierówność.

Artut97
Użytkownik
Użytkownik
Posty: 318
Rejestracja: 18 paź 2015, o 17:31
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 265 razy
Pomógł: 1 raz

[C] Program rozwiązujący pewną nierówność.

Post autor: Artut97 »

Dla jakich liczb naturalnych n prawdziwa jest nierówność:

\(\displaystyle{ 1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n}>10}\)

Napisz program w C wyznaczający najmniejszą z takich liczb n.

Ma ktoś jakiś pomysł jakby można było to zrobić?
szw1710

[C] Program rozwiązujący pewną nierówność.

Post autor: szw1710 »

Czy studiujesz informatykę? Nieważne w jakim języku piszesz. Zwiększaj \(\displaystyle{ n}\) dopóki suma jest mniejsza lub równa \(\displaystyle{ 10.}\) To algorytm. Startujemy z \(\displaystyle{ n=1}\) i \(\displaystyle{ S=1}\). \(\displaystyle{ S}\) to ta suma po lewej.
Awatar użytkownika
NogaWeza
Użytkownik
Użytkownik
Posty: 1481
Rejestracja: 22 lis 2012, o 22:24
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 147 razy
Pomógł: 300 razy

[C] Program rozwiązujący pewną nierówność.

Post autor: NogaWeza »

Będziesz musiał dodawać tutaj bardzo dużo tych liczb, żeby uzbierać te \(\displaystyle{ 10}\). Mogą powstać błędy, choć nie znam się na tyle na analizie numerycznej, żeby stwierdzić, czy te błędy mogę jakoś bardzo zniekształcić Twoją odpowiedź. Niemniej polecam

Kod: Zaznacz cały

https://pl.wikipedia.org/wiki/Algorytm_sumacyjny_Kahana
szw1710

[C] Program rozwiązujący pewną nierówność.

Post autor: szw1710 »

Masz rację. Ale tu chyba chodziło o sam teoretyczny algorytm. Zamiast \(\displaystyle{ 10}\) równie dobrze można by wziąć \(\displaystyle{ 2}\).

Rozwiązanie w R

Kod: Zaznacz cały

n<-1
S<-1
while (S<=10){
  n<-n+1
  S<-S+1/n
}
n
Dostaję \(\displaystyle{ n=12367}\). Teraz

Kod: Zaznacz cały

> sum(1/1:12366)
[1] 9.999962
> sum(1/1:12367)
[1] 10.00004
Czy potraciły się bity i błędy się nałożyły - nie wiem.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Program rozwiązujący pewną nierówność.

Post autor: kalwi »

szw1710 pisze:Dostaję \(\displaystyle{ n=12367}\). Teraz

Kod: Zaznacz cały

> sum(1/1:12366)
[1] 9.999962
> sum(1/1:12367)
[1] 10.00004
Czy potraciły się bity i błędy się nałożyły - nie wiem.
Potwierdzam.

Kod: Zaznacz cały

#include <stdio.h>

int main(void)
{
    unsigned long int n = 0;
    double sum = 0;
    while(sum <= 10)
    {
        ++n;
        sum += 1.0/n;
    }
    printf("%lu", n);
    return 0;
}
Double ma 35 cyfr precyzji po przecinku, a \(\displaystyle{ \frac{1}{12367} \approx 0.0001}\)
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Program rozwiązujący pewną nierówność.

Post autor: Afish »

kalwi pisze:Double ma 35 cyfr precyzji po przecinku
Aż tak dobrze nie ma, podwójna precyzja z IEEE 754 ma 15-16 cyfr dziesiętnych.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Program rozwiązujący pewną nierówność.

Post autor: kalwi »

O popatrz, zawsze mi się wydawało, że float ma 17 a double 35. Widocznie jednak to było 7 i 15. Dzięki za uwagę.
athame
Użytkownik
Użytkownik
Posty: 576
Rejestracja: 2 lut 2012, o 21:42
Płeć: Mężczyzna
Lokalizacja: Radom
Podziękował: 1 raz
Pomógł: 64 razy

[C] Program rozwiązujący pewną nierówność.

Post autor: athame »

W sumie 31 cyfr, z czego ok. połowa przed przecinkiem.
ODPOWIEDZ