我有这段代码:
public class Kata
{
public static bool Narcissistic(int value)
{
//add variale to hold final result
int finalResult = 0;
//get the length of the value input
int valLength = value.ToString().Length;
//convert value given into an array of ints
string valString = value.ToString();
//iterate over each number and multiply that number by the length of value input
for (int i=0; i < valLength; i++) {
//convert char at index[i] of stringified value to int and mutiply by # of digits, store to result
finalResult += int.Parse(valString[i]) * valLength;
}
//return the result
return finalResult == value;
}
}
我在运行此操作时遇到错误,但我不太了解如何修复。我的目标是取一个数字(即1234)并将每个数字乘以它所包含的总位数(即1 * 4 + 2 * 4 + 3 * 4 ......等)。
答案 0 :(得分:1)
假设您只有拉丁字母数字0到9,则可以使用(valString[i] - '0')
代替int.Parse(valString[i])
。
valString[i]
是一个字符,而不是一个字符串(int.Parse()
会期望的)。并且字符在C#中自动转换为它们的Unicode整数代码,并且由于数字0到9具有连续的Unicode值,'0' - '0'
将是数字0减去其自身的字符的Unicode值,i。即0,依此类推,直至'9' - '0'
为9,大于0,i。即9。
如果字符串中可能包含非拉丁数字或非数字字符,则此代码无效。看看你的完整代码,应该满足这个假设,实际上,你是从int转换。
答案 1 :(得分:1)
这是一个更好的选择,完全避免字符串
public static bool Narcissistic(int value)
{
if(value < 0) return false;
int sum = 0;
int count = 0;
while(value>0)
{
sum += value%10;
value /= 10;
count++;
}
return value == (sum*count);
}
基本上value%10
会给你最少的数字。然后value /= 10;
将截断该数字。一旦value
为零,您就会看到所有数字。你的公式(4 * 1 + 4 * 2 + 4 * 3 + 4 * 4)当然可以是4 *(1 + 2 + 3 + 4),这是数字乘以数字的总和。
并且可能没有负面数字&#34; Narcissistic&#34;所以你可以为他们返回false
。
答案 2 :(得分:0)
valString[i]
将是char
- 因为这是索引对字符串的作用。 int.Parse
需要一个字符串。最简单的事情可能只是
finalResult += int.Parse(valString[i].ToString()) * valLength;
假设您想将单个字符数字转换为一位数整数。
这比传统的减去'0'的黑客更“危险”,因为如果char不是数字,你可以依赖int.Parse来抛出异常。
您还需要输入参数uint
,或定义负数的行为。
答案 3 :(得分:-1)
int.Parse()
需要一个字符串,但valString[i]
是一个字符。您可以将其更改为valString[i].ToString()
,但不是解析您可以利用数字字符按顺序编码的事实,方法是将它们转换为int
并减去0
整数的值:
public static bool Narcissistic(int value)
{
int zero = (int)'0';
string valueString = value.ToString();
int total = 0;
foreach(char c in valueString)
{
int digit = ((int)c - zero);
total += digit * valueString.Length;
}
return total == value;
}
或
public static bool Narcissistic(int value)
{
int zero = (int)'0';
string valueString = value.ToString();
return valueString.Select(c => (c - zero) * valueString.Length).Sum() == value;
}
如果你真的想要,你可以将第二个选项写成一行:
public static bool Narcissistic(int value)
{
return value.ToString().Select(c => c - '0').Sum() * value.ToString().Length == value;
}