2012-10-18 33 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

相关问题