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

podzielnosc przez dwie liczby

VPS Starter Arubacloud
0 głosów
2,571 wizyt
pytanie zadane 7 marca 2016 w C i C++ przez trolin99 Początkujący (270 p.)

Tresc zadania: Ile liczb naturalnych z podanego przedziału [sp, sk], jest podzielnych przez obie lub jedną z dwóch podanych liczb b?


Wejście:
Najpierw, w pierwszej linii dwie liczby całkowite 0 < ab < 231
Potem nieokreślona ilość par liczb całkowitych 0 < sp ≤ sk < 231 (każda para w nowej linii).

Moj kod:

#include <iostream>

using namespace std;

int a,b;

int n,m;

int main()
{
    cin>>a,b;

    cin>>n,m;

    for (int i=n; i<=m ;i++)
    {
        switch (i)
        {
        case 1:
            {
                if (i%a=0) cout<<i;
                break;
            }
        case 2:
            {
                if (i%b=0) cout<<i;
                break;
            }
        case 3:
            {
                if (i%a=0 && i%b=0) cout<<i;
                break;
            }
        }
    }


    return 0;
}

Czy ktos powiedzial by mi proszę jakie sa tutaj bledy i ewentualnie jak je naprawic?

 

4 odpowiedzi

0 głosów
odpowiedź 7 marca 2016 przez Aisekai Nałogowiec (42,190 p.)
A jaki błąd jest? Źle liczy, czy kompilator jakiś błąd wyrzuca?
komentarz 7 marca 2016 przez trolin99 Początkujący (270 p.)

kompilator wyrzuca 3 błędy, każdy w tych linijkach:

  if (i%a=0) cout<<i;
  if (i%b=0) cout<<i;
  if (i%a=0 && i%b=0) cout<<i;

komentarz 7 marca 2016 przez Aisekai Nałogowiec (42,190 p.)

 if (i%a==0) cout<<i; 
  if (i%b==0) cout<<i; 
  if (i%a==0 && i%b=0) cout<<i;

powinno teraz działać.

Jedno = to jest operator przypisania. 

komentarz 7 marca 2016 przez trolin99 Początkujący (270 p.)
Rzeczywiście errory zniknęły lecz program nie działa tak jak powinien, po dodaniu czterech liczb nic sie nie wyswietla, program sie konczy. Jak to naprawic by program wyswietlal te liczby, ktore sa podzielne przez a lub b lub a i jednoczesnie b?
komentarz 7 marca 2016 przez Aisekai Nałogowiec (42,190 p.)
Switch działa inaczej niż myślisz.

W przypadku gdy i=1, wykona się ten fragment kodu, który został określony w case 1:

Z 2 i 3 jest analogicznie, a chyba nie o to Ci chodziło nie? :D
komentarz 7 marca 2016 przez Aisekai Nałogowiec (42,190 p.)
#include <iostream>
 
using namespace std;
 
int a,b;
 
int n,m;
 
int main()
{
    cin>>a;
    cin>>b;
 
    cin>>n;
    cin>>m;
 
    for (int i=n; i<=m ;i++)
    {
       
       if (i%a==0) cout<<i;
       else if (i%b==0) cout<<i;
    }
 
    system("PAUSE");
    return 0;
    
}

O coś takiego chodziło? Tylko radzę Ci dodać jakieś couty, bo ciężko wpaść na to, co się wprowadza xD

komentarz 7 marca 2016 przez Aisekai Nałogowiec (42,190 p.)
Tylko jak @Slajni napisał:

1. Zasięg inta jest za mały.

2. Nie sprawdzasz warunku, odnośnie treści zadania. Musiałbyś wrzucić jeszcze while/ do while, gdzie byś sprawdzał te warunki
0 głosów
odpowiedź 7 marca 2016 przez Sinnley Stary wyjadacz (12,810 p.)

Przyczepiłbym się tutaj do switcha.

Warunki lecą pokolei, tzn. od góry do dołu, no chyba, że którysc sie spełni. W każdym chcesz wypisać i więc de-facto wystarczył by ostatni warunek, z tym, że zamiast sumy masz alternatywę. wtedy każdy przypadek się obsłuży.

if (i%a == 0 || i%b == 0 ) cout << i;

Nie sprawdzasz też założeń, które podałes na początku, powinienes wczytywać pętlą tak długo, aż podane n i m nie spełnią warunku 0 < nm231.

Domyslam się, że w warunku chodzi o dwa to potęgi 31. Jesli tak to typ int może nie wystarczyć.

 

komentarz 7 marca 2016 przez trolin99 Początkujący (270 p.)

Pełna treść zadania:

Ile liczb naturalnych z podanego przedziału [sp, sk], jest podzielnych przez obie lub jedną z dwóch podanych liczb b?

Wejście

Najpierw, w pierwszej linii dwie liczby całkowite 0 < ab < 231
Potem nieokreślona ilość par liczb całkowitych 0 < sp ≤ sk < 231 (każda para w nowej linii).

Wyjście

Dla każdego podanego przedziału podać w oddzielnej linii wynik.

Przykład

Wejście:
3 5
1 2
1 3
3 5
1 100
Wyjście:
0
1
2
47

Jak w takim razie zrobić zeby to tak działało?
po wpisaniu danych do konsoli:
3
5
3
5
zamiast wyswietlic 2 wyswietla 35, jak to zmienic?

komentarz 7 marca 2016 przez Sinnley Stary wyjadacz (12,810 p.)

Generalnie to po pierwsze chyba źle rozumiesz pytanie. Przedział liczb jest stały, więc wczytujesz pokolei 4 liczby. Najpierw te dzielniki, sprawdzasz czy znajdują się w przedziale, a następnie bliżej nieokreslona pare dwojek - również z przedziału.

Kiedy je masz wystarczy zrobić fora od początku przedziału do końca i włącznie.

Każdą liczbe sprawdzasz czy jest podzielna przez choć jeden z dwóch dzielników.

Np. w ten sposób.

int d1,d2; // dzielniki
int pp,pk // poczatek i koniec przedzialu

cin >> d1 >> d2 >> pp >> pk;

for (int a=pp; a<= pk; a++) if ( a%d1 == 0 || a%d2 == 0) cout<< pp << pk << endl; 

Pomijam tutaj kwestie sprawdzenia czy liczby są w przedziale, z tym sobie poradzisz.

0 głosów
odpowiedź 7 marca 2016 przez Colossus Mądrala (6,410 p.)
edycja 7 marca 2016 przez Colossus

Niech S i T będą zbiorami skończonymi.

|S ∪ T| = |S| + |T| - |S ∩ T|

Niech zbiór S = {sp, ..., sk}

Niech Da = { n∊S: n dzieli się przez a}

Niech Db = { n∊S: n dzieli się przez b}

Szukamy liczby elementów w zbiorze Da  ∪ Db

Łatwo zauważyć, że |Da| wynosi (sp - sk +1) DIV a

Podobnie |Db| wynosi (sp - sk +1) DIV b

|Da  ∩ D| wynosi (sp - sk +1) DIV a*b

|D∪ Db| = |D| + |Db| - |D ∩ D|

To co napisałem powyżej pozwala napisać program którego złożoność wynosi O(1)

#include <iostream>

using namespace std;

int main() {
	cout<<"Podaj przedzial: ";
	int sp,sk;
	cin>>sp>>sk;
	cout<<"Podaj dwie liczby: ";
	int a,b;
	cin>>a>>b;
	int podzielne_przez_a=(sk/a)-(sp-1)/a;
	int podzielne_przez_b=(sk/b)-(sp-1)/b;
	int podzielne_przez_ab=(sk/(a*b))-(sp-1)/(a*b);
	int podzielne_przez_obie_lub_jedno=podzielne_przez_a+podzielne_przez_b-podzielne_przez_ab;
	cout<<"Ilosc liczb podzielnych przez obie lub jedna z liczb wynosi: "<<podzielne_przez_obie_lub_jedno;
	return 0;
}

 

komentarz 7 marca 2016 przez trolin99 Początkujący (270 p.)
Gdzieś w twoim rozwiązaniu jest błąd ponieważ podając przedział <3,5> i dzielniki: 3,5 wg twojego programy odpowiedz to 1, a prawidłowa odpowiedz to 2. Zarówno 3 dzieli się przez 3 jak i 5 przez 5.
komentarz 7 marca 2016 przez Colossus Mądrala (6,410 p.)
Fakt, zapomniałem napisać, że program liczy ilość liczb podzielnych od a do b, jeśli a=1. Zaraz zedytuję kod, żeby działał prawidłowo
komentarz 7 marca 2016 przez trolin99 Początkujący (270 p.)

Jeśli masz jeszcze trochę cierpliwości :D to pomoglbys mi w znalezieniu bledow w tym kodzie?:

#include <iostream>
#include <math.h>
#include <cstdlib>

using namespace std;

int a,b;

long long int pp,kp; // poczatek i koniec przedzialu

long int suma=0;

int main()
{
    cout<<"Wypisz dzielniki: ";
    cin>>a;
    cin>>b;

    cout<<"Wypisz przedział: ";
    cin>>pp;
    cin>>kp;

    for ( (long int i>0 && i>=pp); ( i<(pow(2,31)) && i<=kp ) ; i++)
    {

       if (i%a == 0 || i%b == 0 )
        {
           suma=suma+1;
        }
        cout<<suma<<endl;
    }

    return 0;

}

Jest to ten sam kod co twoj ( a przynajmniej tak mi sie wydaje ) ale w bardziej przystepnej dla mnie formie.
Błędy wywala w linijce gdzie jest "for" i nie moge ich znalezc.

komentarz 7 marca 2016 przez Colossus Mądrala (6,410 p.)
for (long int i=pp;i<=kp; i++)
    {
       if (i%a == 0 || i%b == 0 )
        {
           suma=suma+i;
        }
    }
cout<<suma<<endl;

 

komentarz 7 marca 2016 przez trolin99 Początkujący (270 p.)
Dobra, bardzo dziekuje za pomoc, jeszcze jakies tam problemy sa ale to juz jutro samodzielnie wroce do tego problemu- biorac pod uwage wszystkie komentarze po- lekkiej przerwie... Jeszcze raz dziekuje wszystkim co komentowali!!
–1 głos
odpowiedź 8 marca 2016 przez Grzesiek Eleryk Mądrala (6,820 p.)
Podpowiem. Pierwiastek.

Podobne pytania

0 głosów
3 odpowiedzi 2,129 wizyt
pytanie zadane 5 maja 2015 w C i C++ przez Jolcik Nowicjusz (150 p.)
0 głosów
1 odpowiedź 3,616 wizyt
pytanie zadane 13 lipca 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
5 odpowiedzi 4,424 wizyt
pytanie zadane 26 października 2017 w C i C++ przez mn130496 Gaduła (3,530 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...