2014-01-20 136 views
0

看來,我的代碼是不工作的項目歐拉問題1. 問題指出:項目歐拉,#1

如果我們在下面列出10是3或 倍數的所有自然數5,我們得到了3,5,6和9這倍數的總和爲23

找到3所有倍數低於1000

總和或5我的程序的輸出是

我的代碼是:

private static final int max = 1000; 
    private static int sum; 

    public static void main(String[] args) 
    { 
     addMultiples(3); 
     addMultiples(5); 
     System.out.println(sum); 
    } 

    private static void addMultiples(int mult) 
    { 
     int x = mult; 
     while(x < max) 
     { 
      sum += x; 
      x += mult; 
     } 
    } 

看來,數學的基本原理簡單地躲避我,這真的阻礙我成爲一個程序員,如果我不能尋找似乎是解決這樣一個簡單問題的方法。

+10

提示:15是3 __and__ 5 – Blastfurnace

+0

要添加號碼的多是那些既多3和5的兩倍的總和。 – Juvanis

+2

OP:如果你不能讓你的程序在第一次嘗試中工作,不要不高興。 _這發生在我們所有人身上._ –

回答

6

首先,也是最重要的,不要氣餒。它只是一個問題,而且作爲一名程序員,這是一個非常糟糕的潛力指標。只要繼續練習,而且任何人,你的錯誤都比編程更重要。

如果我們列出小於16的3的倍數,我們得到:3,6,9,12,15。 如果我們列出小於16的倍數爲5的數字,我們得到:5,10 ,15.

看到問題了嗎?

你數了15次兩次。你大概可以弄清楚實現,所以我不打擾你給你代碼。這不會讓你更好。

此外,這個問題可以用數學和總和更有效地解決,但我會把它留給你。

1

這裏有個小錯誤。

15是5的倍數,是3的倍數。所以你不想這樣算兩次! :)

你可以做的一件事(這是我的功能方說)是創建一個從0到最大的列表。然後創建一個方法,取出3的倍數並將它們添加到結果列表中,並將它們從輸入列表中刪除。現在這個修剪下來的列表被傳遞給一個過濾出所有5的倍數的方法,並將它們添加到同一個輸出列表中。

你拿你的清單的總和。

編輯:約翰內斯Trümpelmann的解決方案是短暫的,可讀性和更高性能,所以你可能會想要去一個.. :)

2

你這樣做有3 5像15的倍數增加的錯誤兩次。

public static void main(String[] args) { 
    long sum = 0; 
    for(int i = 0; i <= 1000; i++) if(i%3==0 || i%5==0) sum += i; 
    System.out.println(sum); 
} 
+1

-1用於發佈_was未被要求的解決方案_。 –

1

你的錯誤是你沒有考慮到你的分頻器的倍頻被計算兩次。所以我建議你改變addMultiples以得到一系列的分隔線。檢查一個循環內的分隔,如果他們分開的特定號碼:

private static int sum; 

public static void main(String[] args) 
{ 
    addMultiples(new int[]{3,5}); 
    System.out.println(sum); 
} 

private static void addMultiples(int[] mult) 
{ 
    int x = 1; 
    while(x < max) 
    { 
     for(int i = 0; i < mult.length; i++){ 
      if(x % mult[i] == 0){ 
       sum += x; 
       break; 
      } 
     } 
    } 
}