Liczby z przedziału podzielne przez K

0

Witam

Napisałem prosty program w ramach kursu (ile liczb z przedziału <a, b> jest podzielnych przez K, próbowałem na wiele różnych sposobów, oto mój najkrótszy kod:

#include <iostream>
using namespace std;

int main()
{
    int a, b, k, j;
    cin >> a >> b >> k;
    j=0;
    for(a; a <= b; a++)
    {
        if(a%k==0) j++;
    }
    cout << j;
return 0;
}

W internetowym kompilatorze kursu wyskakuje takie coś: "program exited due to signal 9" oraz "przekroczenie limitu czasu", przez co mi system nie zalicza tego programu.
Liczby mają należeć do przedziału "a, b, k (1 ≤ a ≤ b ≤ 2 · 109, 1 ≤ k ≤ 2 · 109". Próbowałem także dłuższą wersję z tablicą, lecz to jest najkrótsza wersja programu, jaką udało mi się wymyślić. Proszę o pomoc, czyli wskazanie, gdzie jest błąd.

P.S
Próbowałem z kilkoma typami zmiennych (unsigned short, unsigned int, short, long), lecz dalej nic się nie zmienia.

4

Ale po co tutaj w ogóle jakaś pętla?
Nie jesteś w stanie stwierdzić, ile liczb podzielnych przez np.3 znajduje się w zbiorze 1..10, tylko musisz sprawdzać każdą z osobna?

4
#include <iostream>
using namespace std;

int main()
  {
   unsigned a,b,k;
   cin>>a>>b>>k;
   cout<<(b+k-1)/k-(a+k-2)/k<<endl;
  }
0

Dzięki za szybki odzew.

Patryk_27, tak było mi najłatwiej, dopiero teraz pomyślałem, że jest możliwość rozwiązania tego inaczej, lecz nadal błądzę.

_13th_Dragon, działa, ale nie do końca... Program ma obliczać czy liczby z początku i końca przedziału są także podzielne, czyli np. liczby z przedziału a = 2, b = 4, c = 2 - przedział <2, 4>, czyli liczby podzielne przez 2 to 2 i 4. Albo tak samo z przedziałem <10, 20>, liczby podzielne to 10 i 20.
Wymyśliłem coś takiego:

   if(a%2==0) cout << ((b / k) - (a / k)) + 1;  else cout << ((b / k) - (a / k));

ale też nie działa w każdym przypadku.

Sprecyzowałem mój problem (edytując temat): "ile liczb z przedziału <a, b> jest podzielnych przez liczbę K".

4

Jeżeli chcesz włącznie to:

#include <iostream>
using namespace std;
 
int main()
  {
   unsigned a,b,k;
   cin>>a>>b>>k;
   cout<<(b+k)/k-(a+k-1)/k<<endl;
  }
0

Dzięki wielkie! O to chodziło :)

2
benzulli napisał(a):

Dzięki wielkie! O to chodziło :)
Nie ma za co ;P
Następne zadanie będzie bardziej skomplikowane ale prawie na 100% nie dasz rady go rozwiązać bo nie potrenowałeś na tym, więc prawdopodobnie też dostaniesz na forum gotowca.
Przy jakimś tam kolejnym już na 300% nie będziesz w stanie zrobić samodzielnie zaś będzie zbyt skomplikowane aby dostać gotowca za darmo.
Więc prawdopodobnie zgłosisz się do mnie i nieco zarobię.

1

Mógłby ktoś wytłumaczyć skąd wziął się ten wzór?

(b+k)/k-(a+k-1)/k

0

zajrzyj np tu http://www.zadania.info/d453/9650024, masz tam wyświetloną teorię szybkiego liczenia tego. Ten wzór pewnie wynika z któregoś z tych sposobów

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