Informatică, întrebare adresată de spamhack009, 9 ani în urmă

Primesc doar 80 de puncte la aceasta problema. Acesta este codul pe care l-am folost int multipli(int a,int b,int c)
{
int nr=0;
for(int i=a;i<=b;i++)
{
if(i%c==0)
nr++;
}

return nr;
}
Ce este gresit?

[FMultiplu]
Cerinţa
Scrieți definiția completă a subprogramului multipli, cu trei parametri a , b , c (a≤b), numere naturale, ce returnează numărul multiplilor lui c din intervalul [a;b].

Restricţii şi precizări
numele funcției va fi multipli
funcția va avea 3 parametri, în această ordine: a, b, c.
1 ≤ a , b , c ≤ 1.000.000.000

Exemplu
Pentru a=10, b=27, c=5 subprogramul returnează valoarea 4.

Răspunsuri la întrebare

Răspuns de lozanalex
9
Nu are sens parcurgerea tuturor numerelor de la a la b, findca daca x e multiplu pentru y atunci urmatorul multiplu al lui y va fi x+y
deci va fi o varianta mai optimizata de a scri functia astfel

int multipli(int a, int b, int c)
{
  int i,nr=0;
  for (i=a; i<=b; )
    if (i % c !=0) i++; else break;
  for (int j=i; j<=b; j+=c)
    nr++;
  return nr;
}

De asemenea, se poate de atras atentia ca nr de multipli e proportional cu diferenta dintre limita de dreapta a intervalului si cea de stanga
de unde obtinem formula pentru numarul de multipli (il voi nota cu nr) e
nr=(b-a)/c
insa sunt unele exceptii daca unul sau ambele capete ale intervalului il devid pe c, raspunsul corect va fi cu 1 mai mult
deci obtinem functia

int multipli(int a, int b, int c)
{
  int nr=b/c-a/c;
  if  (b % c == 0 || a % c == 0) nr ++;
  return nr;
}

Mai sus scriam ca formula trebuie sa fie (a-b)/c, insa in functie am folosit b/c-a/c, cred ca e magie sau eu m-am gresit la calcule, am dat functiei mai multe teste, nu am gasit nici un raspuns gresit

spamhack009: Acum doar 90 de puncte. Tot nu pot intelege ce nu merge bine.
lozanalex: Ai incercat si cu (b-a)/c?
spamhack009: Am primit un raspuns mai sus cu care am reusit sa iau cele 100 de puncte. Iti multumesc si tie <3
Răspuns de express
27
int multipli(int a, int b, int c)
{
    int nr = b / c - a / c;
    if(a % c == 0) nr ++;
    return nr;
}


spamhack009: Acesta a functionat perfect. Iti multumesc.
Alte întrebări interesante