如何在整数中找到9的个数

时间:2012-10-18 20:40:00

标签: c#

我有以下方法,应该在整数中找到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个,但上面的方法总是返回零。知道出了什么问题吗?

3 个答案:

答案 0 :(得分: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); 
}

<强>控制台:

  

57500

然而,您可以将int转换为字符串,然后检查字符串中的每个字符(如果它是9);

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

答案 1 :(得分: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

答案 2 :(得分:2)

尝试

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

由于字符串实现IEnumerable<char>,您可以直接将LINQ应用于字符串,而不必将其转换为字符枚举。


<强>更新

uint转换为字节数组将无法按预期方式工作,因为uint不会直接存储数字的小数位数。该数字存储为二进制数,可以超过四个字节。即使您的号码有9个十进制数字,unit总是有四个字节。

您可以将数字转换为字符串,以获得其十进制表示。