Project Euler: Problema 1

26 de October de 2011 | By | 8 Comments

Começando com mais uma série de posts. Desta vez vou postar soluções (com explicação) de alguns problemas que resolvi no Project Euler.

Link do problema: http://projecteuler.net/problem=1

Descrição do Problema:

Se listarmos todos os números naturais menores do que 10 que são múltiplos de 3 ou 5, temos: 3, 5, 6 e 9. E a soma desses múltiplos é 23.

Encontre a soma de todos os múltiplos de 3 e 5 menores do que 1000.

Solução:

A solução que encontrei foi fazer um bloco for, de 3 até 1000, e verificar se o número é múltiplo de 3 ou 5 (usando a função mod). Caso positivo, adiciona à soma. Depois é só pegar o resultado final e fazer o input no problema.

Código:

package com.loiane.projecteuler;

public class Problem1 {

	public static void main(String[] args) {

		int total = 0;

		//the first multiple is number 3
		for (int i=3; i<1000; i++){
			if ((i % 3 == 0) || (i % 5 == 0)){
				total += i;
			}
		}

		System.out.println(total);
	}
}

Para ver a solução, basta executar o código acima.

Essa foi a solução mais rápida e simples que encontrei.

Mais sugestões?

Lista de mais problemas do Project Euler resolvidos: http://www.loiane.com/projetos/project-euler/

Meu repositório no GitHub: https://github.com/loiane/project-euler

Posts Similares

Filed in: Project Euler | Tags: ,

Comments (8)

  1. Gustavo

    Loiane,

    pensei diferente, fiz dois for um de 3 em 3 e um de 5 em 5 testando se não é multiplo de 3, comparei com o que você fez, analise:

     long inicio = new Date().getTime();  long total = 0;
     //the first multiple is number 3  for (int i=3; i<100000000; i++){   if ((i % 3 == 0) || (i % 5 == 0)){    total += i;   }  }
     System.out.println(total);  long fim = new Date().getTime();  System.out.println(fim-inicio);    inicio = new Date().getTime();  total = 0;
     for (int i=3; i<100000000; i=i+3)    total += i;  for (int i=5; i<100000000; i+=5) if(i%3!=0) total += i;    System.out.println(total);  fim = new Date().getTime();  System.out.println(fim-inicio);

  2. Gustavo

    Olha a saída:

    23333333166666688182333333316666668142

  3. Olá!

    A solução do Gustavo tem uma complexidade menor, mas acredito que a solução correta para “Encontre a soma de todos os múltiplos de 3 e 5 menores do que 1000.” seria fazer apenas um for de 3 em 3 e no if ter: i%3==0 && i%5==0, pois a soma deve ser feita com os número que são múltiplos de 3 E 5, e neste caso, bastaria percorrer de 3 em 3, caso o número seja múltiplo de 3 e também de 5, incluiria-o na soma.

  4. Oi Loiane!

    Estou praticando programação funcional, já conhece? Fiz o seu exemplo em FP com o Apache Functor :-) Olha como ficou.

    https://gist.github.com/1320080

    Curti o projeto Euler, vou dar uma olhada nos exercícios. Obrigado, Abraços!

  5. Loiane,

    pensei da mesma forma que vc, mas tb gostei da solução do gustavo.

  6. Legal as soluções pessoal!
    Essa é a parte legal de posts como esse, aprender outras formas de calcular que chegam a um mesmo resultado! :)
    []‘s

  7. charles.eduardo

    Opa Loiane, achei legal todas as soluções. Mas nao sei o objetivo é performace.

    Porem pensei em uma solução diferente das citadas… seria …. em todas entradas verificar se o ultimo caracterer é 0 ou 5 se nao for ir somando de forma recursiva a chegar a so um caracter se for 3, 6 ou 9 pertence a soma total… Mas acredito que ocupe mais espaço e de mais trabalho p/ o processamento!!!

  8. Luiz Augusto Prado

    Bem legal esse projeto Euler. Vi hoje em seu site e escrevi sobre ele aqui:
    http://www.ideiasdeprogramacao.blogspot.com/2011/12/desafios-de-programacao-project-euler.html
    Minha solucao:

    function solucao( razao_a, razao_b, limite)
    {
    var num_termos_a = ( limite – (limite % razao_a)) / razao_a;
    var num_termos_b = ( limite – (limite % razao_b)) / razao_b;
    var razao_ab = razao_a*razao_b;
    var num_termos_ab = ( limite – (limite % razao_ab)) / razao_ab;

    var soma_r3 = razao_a *num_termos_a *(num_termos_a +1)/2;
    var soma_r5 = razao_b *num_termos_b *(num_termos_b +1)/2;
    var soma_r15= razao_ab*num_termos_ab*(num_termos_ab+1)/2;

    return (razao_a<limite?soma_r3:0) + (razao_b<limite?soma_r5:0) – (razao_ab<limite?soma_r15:0) ;
    }
    // numeros menores que 1000
    alert(solucao(3,5,999));

Leave a Reply

Trackback URL | RSS Feed for This Entry