Mihnea s-a lăudat în faţa lui Dan că a citit o carte groasă, care sigur are mai puțin de 1000
citit, Mihnea i-a răspuns: "Pentru scrierea tuturor numerelor paginilor, s-au folosit n cifre"
afisează mesajul "minciunică" dacă numărul n nu poate reprezenta numărul de cifre utiliza
Exemplu: Pentru n=21 se afişează 15, pentru n = 204 se afişează 104, iar pentru n = 22 se afiseaza “minciuna”. Se poate o explicație și o rezolvare, va rog?

Răspuns :

#include <iostream>

using namespace std;

int main()

{

   int n,i=1,nr_pagini=0;

   cin>>n;

   while (nr_pagini<n)

   {

       if (i<=9) nr_pagini = nr_pagini + 1;

       if (10<=i && i<=99) nr_pagini = nr_pagini + 2;

       if (100<=i && i<=999) nr_pagini = nr_pagini + 3;

       if (nr_pagini==1000) nr_pagini = nr_pagini + 4;

       i++;

       //cout<<nr_pagini<<endl;

   }

   if (nr_pagini==n) cout<<i-1;

   else cout<<"minciuna";

   return 0;

}

"Pentru scrierea tuturor numerelor paginilor, s-au folosit n cifre"

Pentru n=21 rezultă că s-au folosit 21 de cifre

pagina 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

nr.pagini 1 2 3 4 5 6 7 8 9 11 13 15 17 19 21

nr_pagini < n, deci 21 < 21 F se iese din while, dar înainte de asta se mai face o data i++, motiv pentru care afișăm la sfârșit i-1 (15);

Pentru n=22 rezultă

pagina 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

nr.pagini 1 2 3 4 5 6 7 8 9 11 13 15 17 19 21 23

23 < 22 F se iese din while, dar 23 != 22, de unde rezultă "minciuna"

Asta este rezolvarea crescătoare (care aduna cat timp nr_pagini<n), dar se mai poate folosi și metoda descrescătoare unde scazi din n 1,2,3 sau 4, adică

n=21         : 20 19 18 17 16 15 14 13 12 10  8  6  4  2   0

nr_pagini :  1    2   3  4  5  6   7  8  9  10 11  12 13 14 15

if (n==0) cout<<nr_pagini;

else cout<<"minciuna";

Sper că te-am ajutat :)