Problema #5

Idei de rezolvare pentru problemele de pe projecteuler.net.

Problema #5

Postby Payne » 30 Apr 2010, 19:11

Enunt
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest number that is evenly divisible by all of the numbers from 1 to 20?


Luam toti multiplii lui 20 si vedem daca is divizibili intre numerele din intervalul 11-19. De ce 11-19 daca in problema zice 1-20. Deoarece 1-10 sunt divizori ale numerelor 11-20, adica 12 = 6*2 adica 12 = 3*2*2*1 si doar din numarul 12 ne dam seama ca putem sari peste numerele 6,3,2,1. Numarul 16 = 4*4= 2*2*2*2 asa ca scoatem numerele 4,2,1. Deci cum ziceam ca putem sa sarim peste numerele 1-10. Si de ce sarim peste numarul 20, deoarece numarul pe care il probam e un multiplu al lui 20 asa ca prin definitie e divizibil cu 20.

  1.  
  2.             bool done = false;
  3.             UInt32 last = 20; // in last o sa se salveze numarul divizibil intre numerele din intervalul 1-20
  4.             int x = 2;
  5.             while (!done) {
  6.                 last = (UInt32)(20 * x);
  7.                 done = true;
  8.                 // incepem de la 11 numerele mai mici is divizori ale numerelor 11-20 si terminam la 19 deoarece last este un multiplu al lui 20
  9.                 for (int u = 11; u < 20; u++) {
  10.                     if (last % u != 0) {
  11.                         done = false;
  12.                         x++;
  13.                         break;
  14.                     }
  15.  
  16.                 }
  17.             }
  18.  
0,0p / 0 votes
Suit up!
User avatar
Payne
Byte
 
Joined: 04 Jan 2010
Location: 0x7C00
Status: 17

Re: Problema #5

Postby Mihai » 30 Apr 2010, 20:56

O altă rezolvare (mult mai buna ca şi complexitate) poate fi scrisă dacă se observă că numărul cerut este, defapt, cel mai mic multiplu comun al numerelor de la 1 la 20 - care este acelaşi cu cel al numerelor de la 10 la 19.
Pentru a calcula CMMMC-ul a 2 numere, se poate folosi algoritmul lui Euclid pentru determinarea CMMDC-ului - ştiind CMMMC(a,b)=a*b/CMMDC(a,b).
0,0p / 0 votes
User avatar
Mihai
Byte
 
Joined: 29 Dec 2009
Status: 25


Return to Project Euler

Who is online

Users browsing this forum: No registered users and 0 guests