C#无法转换'char';表达式输入'string';
我有以下代码:C#无法转换'char';表达式输入'string';,c#,.net,parsing,c#-4.0,C#,.net,Parsing,C# 4.0,我有以下代码: 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
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;
}
}
公共类Kata
{
公共静态布尔自恋(int值)
{
//添加变量以保存最终结果
int finalResult=0;
//获取输入值的长度
int valLength=value.ToString().Length;
//将给定的值转换为整数数组
字符串valString=value.ToString();
//迭代每个数字,并将该数字乘以输入值的长度
for(int i=0;i
当我运行这个程序时,我遇到了一个我理解的错误,但不知道如何修复。我的目标是取一个数字(即1234)并将每个数字乘以它包含的总位数(即1*4+2*4+3*4…等等)。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)
{
return value.ToString().Select(c => c - '0').Sum() * value.ToString().Length == value;
}
valString[i]
将是一个char
——因为这就是索引对字符串的作用int.Parse
需要一个字符串。最简单的方法可能就是
finalResult += int.Parse(valString[i].ToString()) * valLength;
假设将单个字符数字转换为一个数字整数是您的意图
这比传统的减去“0”的方法“危险”要小,因为如果字符不是数字,可以依赖int.Parse抛出异常
您还需要使输入参数
uint
,或定义负数的行为。假设您只有拉丁数字字符0到9,您可以使用(valString[i]-“0”)
而不是int.Parse(valString[i])
valString[i]
是一个字符,而不是字符串(这是int.Parse()
所期望的)。字符会自动转换为C#中的Unicode整数码,由于数字0到9具有连续的Unicode值,'0'-'0'
将是数字0减去自身的字符的Unicode值,即。E0,依此类推,直到'9'-'0'
比0多9,即。E九,
如果字符串中可能有非拉丁数字或非数字字符,则此代码将不起作用。查看完整的代码,应该满足这个假设,因为实际上,您是从int转换而来的。这里有一个更好的选项,可以完全避免使用字符串
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);
}
公共静态bool自恋(int值)
{
如果(值<0)返回false;
整数和=0;
整数计数=0;
而(值>0)
{
总和+=值%10;
数值/=10;
计数++;
}
返回值==(总和*计数);
}
基本上,值%10
将为您提供最低有效位。然后值/=10代码>将截断该数字。一旦值
为零,您就可以看到所有数字。你的公式(4*1+4*2+4*3+4*4)当然可以是4*(1+2+3+4),这是数字的总和乘以数字
大概没有负数是“自恋的”,所以你可以为他们返回false
。无法读取未格式化为code的代码你在int和string之间来回转换,为什么?您得到的确切错误/问题是什么?如果您使用%10
获取最低有效位,并使用/10
截断最低有效位,则可以完全避免使用字符串。让我的+1让我们熟悉以下概念:它不应该是位数的幂而不是*长度吗?啊,我明白了你做到了!这正是我想要做的。使用for循环,获取字符串中的每个字符并将其转换为int。将尝试此方法并返回给您我必须承认我没有试图理解其背后的算法-实际计算可能在一行中完成,但在codegolf.stackexchange,他们的情况就不同了。com@juharr起初我看错了问题。现在应该好多了。最简单的情况是负整数,-符号是无效输入。OP应该定义为uint
,或者添加异常处理,或者定义负数的行为。@dlatikay说得对!这是迄今为止对书面问题的最佳答案。。。尽管我怀疑他对“自恋”的解释是错误的,因此他应该提升到长度的力量,让负数成为可能的竞争者。当然,我的数字也处理得不好。@JoelCoehoorn实际上自恋的数字不会是负数,因为单个数字不会被认为是负数。
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);
}