Ilość liczb dzielących się bez reszty

0

Witam. Potrzbuje pomocy z kodem w C++. W wykomentowanym fragmencie kodu mam podaną instrukcje do wykonania. Mam wykazać prawidłowość zapisanej tam funkcji.
Muszę zastosować się do funkcji z pętlą for i zrobić do tego test. Napisałem to w ten sposób. Nie jestem pewien czy ten kod jest w ogóle prawidłowy. Mam błąd w for to jest pewnie. Nie wiem jak go dokładnie zapisać.

#include <iostream>
using namespace std;
/**
 * a1, początek przedziału
 * a2, pierwsza liczba za końcem przedziału
 * dzielnik - liczba przez którą dzielimy
 * return - ilość liczb dzielących się bez reszty przez dzielnik 
 * 
 * f(2,10,3) -> 3 (a1 - 2) (a2 - 10) (dzielnik - 3) (3 - return)
 * f(4,12,4) -> 2 (a1 - 4) (a2 - 12) (dzielnik - 4) (2 - return)
 * 
*/
int iloscLiczbDzielacychSieBezReszty(int a1,int a2, int dzielnik)
{
    int wynik=0;
    for(int i=a1; i=(a1+a2-1)/dzielnik)
{
    wynik+=i;
} 
    return wynik;
}
int main()
{
    cout<<(iloscLiczbDzielacychSieBezReszty(2,10,3));
    cout<<"\n";
    cout<<(iloscLiczbDzielacychSieBezReszty(4,12,4));
    return 0;
}
2

Masz błąd w pętli to pewne, bo nic tam nie ma, (tylko inkrementowanie wyniku). Iteruj od poszątku do końca przedziału i wstaw warunek sprawdzający czy reszta jest zerem. Operator, % (modulo).

4

Bez testów: for(int i=a1; i<a2; ++i) wynik+=(i%dzielnik==0);

UPDATE Jest na to jakiś wzór matematyczny co by to robić bez pętli?

5
int iloscLiczbDzielacychSieBezReszty(int a1,int a2, int dzielnik)
{
    auto n = a2 / dzielnik - a1 / dzielnik;
    return n + (a1 % dzielnik == 0) - (a2 % dzielnik == 0);
}

Tyle, że to nie działa dla przedziału liczb ujemnych, kombinuj sam dlaczego i jak poprawić:
https://godbolt.org/z/jW4cvcfz8

0

@KamilAdam @lion137 @MarekR22
Problem został rozwiązany. Co do tego wzoru matematycznego. Ja nie znam. Z ciekawości w wolnym czasie pokombinuje co do tych liczb ujemnych. Dzięki wielkie za pomoc. Działający kod:

#include <iostream>
#include <functional>
using namespace std;
/**
 * a1, początek przedziału
 * a2, pierwsza liczba za końcem przedziału
 * dzielnik - liczba przez którą dzielimy
 * return - ilość liczb dzielących się bez rzeszty przez dzielnik 
 * 
 * f(2,10,3) -> 3 (a1 - 2) (a2 - 10) (dzielnik - 3) (3 - return)
 * f(4,12,4) -> 2 (a1 - 4) (a2 - 12) (dzielnik - 4) (2 - return)
 * 
*/
int iloscLiczbDzielacychSieBezReszty(int a1,int a2, int dzielnik)
{
    int wynik=0;
for(int i=a1; i<a2; ++i)
{
wynik+=(i%dzielnik==0);
} 
    return wynik;
}
int main()
{
    cout<<(iloscLiczbDzielacychSieBezReszty(2,10,3));
    cout<<"\n";
    cout<<(iloscLiczbDzielacychSieBezReszty(4,12,4));
    return 0;
}
3
int iloscLiczbDzielacychSieBezReszty(int a1,int a2, int dzielnik) { return (a2+dzielnik-1)/dzielnik-(a1+dzielnik-1)/dzielnik; }

1 użytkowników online, w tym zalogowanych: 0, gości: 1