我有以下方法,应该在整数中找到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个,但上面的方法总是返回零。知道出了什么问题吗?
答案 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
总是有四个字节。
您可以将数字转换为字符串,以获得其十进制表示。