• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dzieta Riemmana

Object Storage Arubacloud
0 głosów
175 wizyt
pytanie zadane 27 października 2016 w C i C++ przez MiO Obywatel (1,310 p.)

Witam! Mam zadanie aby utworzyć  program liczący Dziete Riemanna ;)  Mam zrobić to w 3 pętlach (for,while,do while). Proszę o wskazówki na temat tego jak to rozwiązać ;)  Wiem tyle, że ma to wyglądać w ten sposób:

dla pętli for (int n = 0; n<1000; n++)
    dla pętli while (b <10000)
    gdzie b jest liczbą w mianowniku
    dla pętli do while (sum != old)
    gdzie old to wynik sum przed każdym kolejnym zsumowaniem

Ogarniam fakt jak to ma działać, ale jakoś nie umiem tego napisać :P  Fragment mojego kodu:
 

#include <iostream>
#include <conio.h>

using namespace std;
 
int suma, old_suma;
int b;
 
int main()
{
	cout.precision(15);
	
		for (int  n = 1; n <= 1000; n++)
		{
			double b = pow(n, 2);
			 
			double suma =    1 / b;
			
		//	cout << suma << endl;
		}

		
	_getch();
	return 0;
}



Kiedy wczytuje to na konsolę otrzymuję na końcu wartość e-06. Jak się tego pozbyć?

Z góry dzięki za wskazówki :)

1 odpowiedź

0 głosów
odpowiedź 27 października 2016 przez criss Mędrzec (172,590 p.)
Po pierwsze - nie sumujesz kolejnych "warazów".

Po drugie - e-06 to nie wartość (to nic nie znaczy). najprawdopodobniej wypisuje ci 1e-06 (co już ma sens) czyli 1 * 10^(-6) co się zgadza bo to właśnie liczy twoja pętla w ostatniej iteracji ( 1. / pow(1000, 2) czyli 1 przez 1000^2 czyli 1 / 1 000 000).

edit: chociaż w sumie możliwe, że faktycznie jest tam e-06, ale jeszcze się nie spotkałem, żeby przed e nie było żadnej liczby.
komentarz 27 października 2016 przez MiO Obywatel (1,310 p.)
gdzie masz niby napisane warazów?
komentarz 27 października 2016 przez criss Mędrzec (172,590 p.)
Nigdzie, po prostu nie wiedziałem jak to nazwać :P
komentarz 27 października 2016 przez MiO Obywatel (1,310 p.)

a ok xd Jakaś podpowiedź jak to napisać? Sumuje bo wzór jest taki:

Mam napisać dokładnie algorytm który to rozwiąże

komentarz 27 października 2016 przez criss Mędrzec (172,590 p.)

Co do:

    dla pętli do while (sum != old) 
    gdzie old to wynik sum przed każdym kolejnym zsumowaniem 

Dlaczego w przypadku do while nie zrobisz tego tak samo jak w przypadku while? 

komentarz 27 października 2016 przez criss Mędrzec (172,590 p.)

Mam napisać dokładnie algorytm który to rozwiąże

Tzn. jak rozwiąże? Nie ma tu żadnej niewiadomej. Z twojego kodu wynika, że chcesz po prostu policzyć wartość funkcji dzeta ogarniczając się do pierwszego tysiący "wyrazów" (jak to nazwałem). I jest w porządku, tyle, że nie sumujesz kolejnych policzonych wyrazów, tylko nadpisaujesz sume. Wystarczy w 17. linii zamienić = na +=

komentarz 27 października 2016 przez MiO Obywatel (1,310 p.)
Ojezu dzięki xDD Nie skumałem o co chodzi bo kompletnie inaczej myślałem.... Tak to jest jak sie nie słucha o co chodzi w poleceniu xdd
komentarz 27 października 2016 przez MiO Obywatel (1,310 p.)
Co do do while. Gość od laborek sobie tak wymyślił :v
komentarz 27 października 2016 przez criss Mędrzec (172,590 p.)
Taka mała uwaga jeszcze, nie wiem czy o tym wiesz. Pamiętaj o inicjalizacji zmiennych jakąś wartością. W tym kodzie nie jest to konieczne, bo zmienne globalne są automatycznie inicjalizowane 0, a gdyby były zadeklarowane w mainie, to najprawdopodobniej dodawałbyś do śmieci z pamięci i wychodziłyby ci... inne śmieci.
komentarz 27 października 2016 przez MiO Obywatel (1,310 p.)
edycja 27 października 2016 przez MiO
#include <iostream>
#include <conio.h>

using namespace std;
 

int main()
{
	cout.precision(15);

	double  suma=0 , old;
	int b = 1, potega;
		for(;;)
		{
			cout << endl;
			cout << "Podaj wartosc potegi: "; cin >> potega;
		cout << endl;
		suma = 0;
		b = 1;
	for (int n = 0; n < 1000; n++)
	{


	  double mianownik =  pow(b, potega);

		suma +=   1 / mianownik;

		b++;

	}
	cout << "Dla petli for: " << suma << endl;
 

	suma = 0;
	b = 1;	

	while (b < 10000)
	{
		 
		
		suma +=   1 / pow(b, potega);
		b++;
	}cout << "Dla petli while: " << suma << endl;
	
	
	

	suma = 0;
	b = 1;
	old = 0;
	do {
		old=suma;
	 
	 
		suma +=   1 / pow(b, potega);
	
		b++;

		 

	} while (suma!=old);
	cout << "Dla petli do while: " << suma;
	cout << endl;
		}
	
	

	_getch();
	return 0;
}



Na chwilę obecną kod wygląda tak. Wszystko działa tylko dla petli do while sie wysypuje :/ dla potegi 2 musi to wynieś 1.6449341. albo powtarza się wartość z while albo wysyp :/ nie wiem jak to ustawić

EDIT: wystarczy usunąć przed do while old=0;

Podobne pytania

0 głosów
1 odpowiedź 124 wizyt
pytanie zadane 21 grudnia 2015 w C i C++ przez Munvik Dyskutant (9,350 p.)
0 głosów
1 odpowiedź 325 wizyt
pytanie zadane 24 maja 2015 w C i C++ przez Mateep Użytkownik (850 p.)
+1 głos
4 odpowiedzi 878 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...