2013-10-28 32 views
0

我想通過這樣來總結卡號每隔位:奇的地方數總和

/* 
Return the sum of the odd-place digits. 
*/ 

public static int sumOfoddPlace(long number) 
{ 
    int maxDigitLength = 16; 
    int sum = 0; 
    for (int i = 1; i <= maxDigitLength; i++) 
    { 
     if (i % 2 == 1) 
     { 
      sum = sum + (int)(number % 10); 
     } 
     break; 
    } 
    return sum; 
} 

我得到的是6。我要尋找的總和應該是37

+3

爲什麼你有這個'break'後內部如果?這會讓你的'for'執行一次! – StepTNT

+0

你有什麼意見6?爲什麼它應該是37? –

+0

刪除@StepTNT提到的'break' – Abubakkar

回答

1

你在第一次迭代時就已經脫離了循環。所以,你不會過去到另一個迭代。

但是,刪除break也不能解決您的問題。 number % 10將始終爲您提供號碼的最後一位數字,而不是每個備用號碼。你應該遵循這種方法:

  • num % 10 - 會給你最後一位數字。
  • 然後通過刪除最後2位數字來更新num
  • 重複
1

嘗試......這應該爲你工作

 public static int sumOfoddPlace(long number) 
    { 
     int maxDigitLength = 16; 
     int sum = 0; 
     for (int i = 0; i < maxDigitLength; i++) 
     { 
      if (i % 2 != 0) 
      { 
       sum = (sum + (int)(number % 10)); 
       number = number/10; 

      }else { 
       number = number/10; 
      } 

     } 
     return sum; 
} 

我在這裏做的是,如果i是奇數,我拿號的MOD,所以我得到的最後然後把它加到總和中,然後我把最後一位數字除以10,如果這個數字是偶數,我只是擺脫i這個位置的數字。

這裏我按照相反的順序收集奇數位數。

+1

您可以通過在'if'語句外部(以及之後)移動'number = number/10;'來消除'else'。實際上,你應該能夠減少一半的迭代次數....你能找到什麼其他的改進(記住鑄造通常是一個昂貴的操作) –

+0

其實,現在,我看着這個有點難,你收集_other_數字 - 你需要翻轉你的條件(假設你改變了'for'循環的初始值)。 –

-1

這是更新的代碼,我已經刪除了flag.log的邏輯,這個代碼更短,更易於理解。

public static int sumOfOddDigits(long number){ 
    int sum = 0; 
    String newString = new StringBuilder(String.valueOf(number)).reverse().toString(); 
    number = Long.parseLong(newString); 

    while (number != 0){ 
     sum = (int) (sum + number % 10); 
     number = number/100; 
    } 
    return sum; 
} 
+0

-1說真的,這個版本有什麼用?看起來它應該工作......除了它太複雜並且違反了一些Java編碼約定。 –

+0

@ Clockwork-Muse我是編程新手,這就是爲什麼它可能違反了Java編碼標準,但就代碼而言,它是完全工作的,它似乎並不複雜...... –

+0

好了,然後...當您使用布爾值時,您正在使用'flag'值。將輸入的數字複製到一個字符串中,將其轉換爲不同的字符串(以完全低效和奇怪的方式將**反轉爲字符串),然後將其轉換爲數字。爲了讓你瞭解這一點(並遵循你所做的一些約定),你應該遇到幾個應該在這裏顯示的功能。充其量,這種方法是危險的並且是錯誤的(它忽略了尾隨零給出偶數/奇數!)... –

0

我還沒有見過的最小的解決方案還沒有,所以這裏有雲:

public static int sumOddDigits(long input) { 
    int sum = 0; 

    for (long temp = input; temp > 0; temp /= 100) { 
     sum += temp % 10; 
    } 
    return sum; 
} 

你不需要10分,並檢查它是否是偶數,所以只需劃分100次。

演示:http://ideone.com/sDZfpU

+0

初始化for循環中的'sum'似乎有點奇怪 - 我只是將循環的初始化部分留空(並且用它的聲明初始化'sum')。 –

+0

@ Clockwork-Muse我這樣做是爲了讓人們不會在for循環中的空初始化語句中感到驚慌。我現在變得更好了。 –