domingo, 3 de dezembro de 2017

Project Euler 1

Aqui vamos implementar duas soluções possíveis, em Powershell (Sum35v1 e Sum35v2), para o problema 1 de Project Euler, que diz o seguinte:


###### Força Bruta
Function Sum35v1([Int32]$N) {
    [Int32]$S3 = 3
    [Int32]$S5 = 5
    [Int32]$S15 = 15

    For ([int32]$i=2; $i -lt $N; $i++) {
        If ((3 * $i) -lt $N) { 
            ## Múltiplos de 3
            $S3 = $S3 + (3 * $i)
        }
        If ((5 * $i) -lt $N) {
            ## Múltiplos de 5
            $S5 = $S5 + (5 * $i)
        }
        If (($N -gt 15) -And ((15 * $i) -lt $N)) {
            ## Múltiplos de 3 e 5
            $S15 = $S15 + (15 * $i)
        }
    }
    
    ## Resultado é a soma dos
    ## múltiplos de 3 e 5 menos
    ## a soma dos múltiplos de 15
    Return ($S3+$S5-$S15)
}

##### Progressão Aritmética
Function Sum35v2([Int32] $N){
    ## A soma de todos os números de 1 a N
    ## pode ser calculado através da fórmula
    ## ( N * (N + 1) ) / 2
    ##
    ## A soma dos múltiplos de 3 até N 
    ## é calculada com 3*(1+2+3+4+...N/3)
    ## N/3=333, assim a soma de 1 até 333
    ## é (333*(333+1))/2
    ## logo a soma dos múltiplos de 3 é:
    [Int32]$S3 = 3*(333*334/2)

    ## A soma dos múltiplos de 5 até N 
    ## é calculada analogamente
    [Int32]$S5 = 5*(199*200/2)

    ## A soma dos múltiplos de 15 até N 
    ## é calculada analogamente
    [Int32]$S15 = 15*(66*67/2)

    Return ($S3+$S5-$S15)
}

Clear-Host
$time = New-Object System.Diagnostics.Stopwatch
$time.Start()
Sum35v1(1000)
$time.Stop()
$ts = $time.Elapsed
Write-Host "Tempo calculado com Força Bruta:"
Write-Host $ts.Seconds "segundos e" $ts.Milliseconds "milisegundos" 

$time2 = New-Object System.Diagnostics.Stopwatch
$time2.Start()
Sum35v2(1000)
$time2.Stop()
$ts2 = $time2.Elapsed
Write-Host "Tempo calculado com Progressão Aritmética:"
Write-Host $ts2.Seconds "segundos e" $ts2.Milliseconds "milisegundos" 

A soma dos múltiplos de 3 e 5 até 1000 é 233168.

Usando Força Bruta [Sum35v1], o tempo gasto foi:
233168
Tempo calculado com Força Bruta
0 segundos e 35 milisegundos

Usando Progressão Aritmética [Sum35v2], o tempo gasto foi:
233168
Tempo calculado com Progressão Aritmética
0 segundos e 10 milisegundos

Nenhum comentário:

Postar um comentário