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

Iloczyn liczb nieparzystych z zadanego przedziału

Cloud VPS
0 głosów
5,104 wizyt
pytanie zadane 26 listopada 2015 w C i C++ przez agre Użytkownik (550 p.)

Policz iloczyn wszystkich liczb nieparzystych z domkniętego przedziału liczb całkowitych [ pierwsza  ..  ostatnia ].
Wartości zmiennych pierwsza, ostatnia należy wczytać z klawiatury.

Tak spróbowałam poradzić sobie z tym problemem:

#include <iostream>
using namespace std;

int iloczyn(int a, int b);
int main()
{
	int a, b;
	cout << "Podaj przedzial [a,b]" << endl;
	cout << "a=";
	cin >> a;
	cout << "b=";
	cin >> b;
	cout << iloczyn(a, b) << endl;
	return 0;
}
int iloczyn(int a, int b)
{
	int suma = 1;
	if (a % 2 == 0 && b % 2 == 0) //dwie parzyste
	{
		for (int i = a; i < b; i += 2)
		{
			suma *= (i+1);
		}
	}

	if (a % 2 == 1 && b % 2 == 0) //a nieparzyste, b parzyste
		for (int i=a; i < b;i+=2)
		{
			suma *= i;
		}
	if (a % 2 == 0 && b % 2 == 1) //a parzyste, b nieparzyste
	{
		for (int i = a; i <= b; i += 2)
		{
			suma *= (i + 1);
		}
	}
	if (a % 2 == 1 && b % 2 == 1) //obydwie nieparzyste
	{
		for (int i = a; i <= b; i += 2)
		{
			suma *= i;
		}
	}


	return suma;
}

 

Co myślice o takim rozwiązaniu? Przekombinowane, czy przyzwoite? smiley Czy może jest jakiś prostszy sposób rozgryzienia tego zadania? 

2 odpowiedzi

0 głosów
odpowiedź 26 listopada 2015 przez niezalogowany
wybrane 26 listopada 2015 przez agre
 
Najlepsza
Przekombinowane. Tworzysz zmienną która będzie przechowywać wynik o nazwie np. wynik która ma wartość 1. Użytkownik podaj liczba a i b. W pętli for tworzysz zmienną i która ma wartość zmiennej a. Pętla wykonuje się dopóki i jest mniejsze lub równe b. Przy każdym obiegu pętli sprawdzasz czy reszta z dzielenia i przez 2 jest równa 1. Jeśli tak to zmienną wynik mnożysz razy i. Tylko 11 linijek kodu.
komentarz 26 listopada 2015 przez agre Użytkownik (550 p.)
	int suma = 1;
	for (int i = a; i <= b; i++)
	{
		if (i % 2 == 1) suma *= i;
	}


	 

I w taki sposób mój kod uległ znacznemu zmiejszeniu.

Dziękuję :D 

 

0 głosów
odpowiedź 26 listopada 2015 przez niezalogowany
Przkombinowane, da się to zadanie rozwiązać 1 if'em
komentarz 26 listopada 2015 przez agre Użytkownik (550 p.)
Hm, ale jakbym tego nie próbowała zrobić jednym ifem, nie bardzo mi idzie.
Jakaś podpowiedź?
komentarz 26 listopada 2015 przez krzemionskyy Użytkownik (630 p.)
ciężko podpowiedzieć, żeby nie podać odrazu całego rozwiązania ;) generalnie spróbuj zacząć od pętli FOR(), a następnie sprawdzać warunki wystapienia liczby nieparzystej.
Pozdrawiam ; )
komentarz 26 listopada 2015 przez niezalogowany

Tak naprawdę są 2 warunki: if i pętla for.

Spójrzmy na ten problem inaczej: wiemy, że liczba nieparzysta jest co drugą liczbą więc jeżeli zaczniemy pętlę for od liczby nieparzystej i kolejne liczby będziemy zwiększali o 2 to zawsze będziemy dodawali liczbę nieparzystą (co zauważyłaś).

Więc tak naprawdę interesuje odpowiedź na pytanie: "czy liczba a jest nieparzysta?".

Wiemy także, że jeżeli liczba x jest parzysta, to x+1 jest liczbą nieparzystą, dzięki czemu możemy zamienić nasze pytanie na "czy a jest liczbą parzystą?", jeżeli tak to powiększ tą wartość o 1 i zsumuj kolejne liczby nieparzyste.

Coś takiego:

if(a % 2 == 0)
  a++;

int iloczyn=0;
for(int i=a;i<=b;i+=2)
  iloczyn *= i;

 

komentarz 26 listopada 2015 przez agre Użytkownik (550 p.)

	if (a % 2 == 0) //czy a jest parzyste
		a++; //parszyste zwiekszam o 1

	int suma = 1;
	for (int i = a; i <= b; i += 2)
		suma*= i;

I w ten sposób jak najbardziej działa.

Dziękuję za kolejny sposób rozwiązania laugh

komentarz 26 listopada 2015 przez krzemionskyy Użytkownik (630 p.)

moja wizja tego zadanka :

for(int i=a; i<=b; i++){ // idzie po każdej liczbie z przedziału

        if(i%2==1){ // jeżeli nieparzysta to mnóż
            sum*=i;
        }
    } // i tyle ;)

 

komentarz 26 listopada 2015 przez niezalogowany
ahh, sorry. Twoja poprzednia zmienna "suma" mnie zmyliła, zmieniłem nazwę na iloczyn, ale zapomniałem o tej zmianie.

@krzemionkyy zobacz, że twoje rozwiązanie wymaga wykonania większej ilości obliczeń, dzielenie modulo to tak naprawdę złożenie kilku dziań, jeżeli możesz uniknąć dzielenia modulo tanim kosztem to warto jest to zrobić.

Podobne pytania

+1 głos
1 odpowiedź 1,585 wizyt
0 głosów
3 odpowiedzi 5,302 wizyt
pytanie zadane 28 grudnia 2016 w C i C++ przez szejmys Nowicjusz (160 p.)

93,488 zapytań

142,421 odpowiedzi

322,772 komentarzy

62,906 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

Kursy INF.02 i INF.03
...