• 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

Object Storage Arubacloud
0 głosów
4,708 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,096 wizyt
0 głosów
3 odpowiedzi 4,836 wizyt
pytanie zadane 28 grudnia 2016 w C i C++ przez szejmys Nowicjusz (160 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...