2012-10-18 29 views
7

我有下面的方法,它應該在一個整數中找到9個總數,該方法用於根據9個數檢索僱員的合同類型。嘗試下面的類: -我如何找到一個整數中的9個數

public class EmployeeCreditCards 
{ 
    public uint CardNumber(uint i) 
    { 
     byte[] toByte = BitConverter.GetBytes(i); 

     uint number = 0; 
     for (int n = 0; n < toByte.Length; n++) 
     { 
      if (toByte[i] == 9) 
      { 
       number = number + 1; 
      } 
     } 
     return number; 
    } 
} 

中,我想找到9有多少是在通過整數,但上面的方法將總是返回零。任何想法出了什麼問題?

+1

是否要計算數字9的出現次數? 123498949返回3? – driis

+2

哇,將CreditCard號碼存儲爲'uint'?你可以只是'Convert.ToString'然後檢查它(更容易,恕我直言)。 –

+0

是9的數字...例如在19199它應該返回3. –

回答

23

你可以做到這一點簡單的一個小LINQ:

public int GetAmountOfNine(int i) 
{ 
    return i.ToString().Count(c => c.Equals('9')); 
} 

但是做加using System.Linq;到CS文件。

你的答案是不工作,因爲要轉換爲字節數轉換爲字節不會爲每一位(通過@Servy一個字節。因此,如果您要將陣列中的每個字節寫入控制檯/調試,您都不會看到自己的號碼。

例子:

int number = 1337; 
byte[] bytes = BitConverter.GetBytes(number); 

foreach (var b in bytes) 
{ 
    Console.Write(b); 
} 

控制檯:

您可以將INT但是轉換爲字符串,然後檢查字符串中的每個字符如果它是九;

public int GetAmountOfNineWithOutLinq(int i) 
{ 
    var iStr = i.ToString(); 
    var numberOfNines = 0; 
    foreach(var c in iStr) 
    { 
     if(c == '9') numberOfNines++; 
    } 
    return numberOfNines; 
} 
+0

首先你不需要'ToCharArray()嗎?或者我錯過了'.Select'的擴展? –

+3

我認爲你的意思是'Where'而不是'Select',但更重要的是,你可以等價地使用'.Count(c => c.Equals('9'))。 –

+4

@BradChristie'string'實現'IEnumerable '。 –

2

嘗試

int numberOfNines = number.ToString().Where(c => c == '9').Count(); 

既然字符串實現IEnumerable<char>,就可以申請直接LINQ到字符串而無需首先將其轉換爲字符的枚舉。


UPDATE

轉換的uint字節數組將無法正常工作預期的方式,因爲uint並不直接存儲你的電話號碼的十進制數字。該號碼以二進制數字形式存儲,並以四個字節爲單位進行存儲。 A unit始終有四個字節,即使您的號碼有9位十進制數字。

您可以將數字轉換爲字符串以獲取其十進制表示形式。

+0

downvote沒有好的不用解釋 - 爲什麼downvote? – codingbiz

+0

我編輯了我的評論,但記錄下來的並不是我的投票。 –

+0

你的解釋是錯誤的。首先,您不需要*將其轉換爲字符串,請參閱Desolator的答案。其次,它與一個二進制數的字節或二進制表示的「單元」無關。將int轉換爲字節會給你(實際上)一個四位數的基數256,它等於整數。問題是他需要將每個基數* 10 *數字輸出。這當然是可能的,他只是做得不對。 – Servy

20

一個典型的解決方案如下:(也許這是最快的算法找到解決方案,只需要O(log n)的時間。)

private int count9(int n) 
{ 
    int ret = 0; 
    if (n < 0) 
     n = -n; 
    while (n > 0) 
    { 
     if (n % 10 == 9) ++ret; 
     n /= 10; // divide the number by 10 (delete the most right digit) 
    } 
    return ret; 
} 

是如何運作的? 考慮一個例子,n = 9943

現在ret = 0。

N%10 = 3,其!= 9

N = N/10 = 994

N%10 = 4!= 9

N = 99

N% 10 = 9,所以RET = 1

N = 9

N%10 = 9,所以RET = 2

n = 0

+0

thanksbut但是什麼n/= 10;裝置 –

+0

@johnG如果鍵入'N = N/10;'可以短它'N/= 10;' – SynerCoder

+0

@johnG相同用'+ =','(%)=','* =',' - = '從頭頂開始 – SynerCoder

相關問題