C# c中的相应操作存在问题#
我对本例中的解决方案有问题,请告诉我操作(codeKata): 您有一个包含N个数字的字符串,每2个数字在一个操作之后(?)返回该字符串中的下一个数字。 编写一个函数,返回带有相应操作的新字符串: 1) 另外, 2) 减法 3) 乘法 4) 分部 因为C# c中的相应操作存在问题#,c#,string,algorithm,data-structures,numbers,C#,String,Algorithm,Data Structures,Numbers,我对本例中的解决方案有问题,请告诉我操作(codeKata): 您有一个包含N个数字的字符串,每2个数字在一个操作之后(?)返回该字符串中的下一个数字。 编写一个函数,返回带有相应操作的新字符串: 1) 另外, 2) 减法 3) 乘法 4) 分部 因为 9-4=5-减法 4*5=20-乘法 5+20=25-相加 我的代码: int x = 0,add = 0, multi = 0, sub = 0, divi = 0, z = 0; var v = stringNumbers.Split('
- 9-4=5-减法
- 4*5=20-乘法
- 5+20=25-相加
我的代码:
int x = 0,add = 0, multi = 0, sub = 0, divi = 0, z = 0; var v = stringNumbers.Split(' ').ToArray(); string s = ""; if (v.Length >= 3) { for (int i = 0; i < v.Length; i++) for (int j = i + 1; j < v.Length; j++) for (int k = j + 1; k < v.Length; k++) { Console.WriteLine(k); x = int.Parse(v[i]); z = int.Parse(v[j]); add = x + z; multi = x * z; sub = x - z; divi = x / z; if (add == int.Parse(v[k])) { s += "addition, "; } else if (sub == int.Parse(v[k])) { s += "subtraction, "; } else if (multi == int.Parse(v[k])) { s += "multiplication, "; } else if (divi == int.Parse(v[k])) { if (int.Parse(v[i]) != 0) s += "division, "; } else { break; } } } else return ""; s = s.Remove(s.Length - 2, 2); return s;
intx=0,add=0,multi=0,sub=0,divi=0,z=0; var v=stringNumbers.Split(“”).ToArray(); 字符串s=“”; 如果(v.长度>=3) { 对于(int i=0;i
这是我的第三篇文章,对我的错误表示歉意。假设
v.length
是5
您希望执行以下循环过程:
j
和k
变化与i
变化是半独立的
i
导出j
和k
,如下所示:
for (int i = 0; i < v.Length - 2; ++i) {
int j = i + 1;
int k = i + 2;
...
}
for (int k = 2; k < v.Length; ++k) {
int i = k - 2;
int j = k - 1;
...
}
无论哪种方式,如果(v.Length>=3)检查都是无用的。的
已执行等效检查。我还建议对v
的元素进行一次解析(在主循环之前),而不是重复解析。假设v.length
是5
您希望执行以下循环过程:
i=0,j=1,k=2
i=1,j=2,k=3
i=2,j=3,k=4
但那不是你要做的。您的j
和k
变化与i
变化是半独立的
i=0,j=1,k=2
i=0,j=1,k=3
i=0,j=1,k=4
i=0,j=2,k=3
i=0,j=2,k=4
i=0,j=3,k=4
i=1,j=2,k=3
i=1,j=2,k=4
i=1,j=3,k=4
i=2,j=3,k=4
要获得期望的结果,您应该只有一个循环。可以从循环变量派生其他值
您可以从i
导出j
和k
,如下所示:
for (int i = 0; i < v.Length - 2; ++i) {
int j = i + 1;
int k = i + 2;
...
}
for (int k = 2; k < v.Length; ++k) {
int i = k - 2;
int j = k - 1;
...
}
无论哪种方式,如果(v.Length>=3)
检查都是无用的。的已执行等效检查。我还建议对v
的元素进行一次解析(在主循环之前),而不是重复解析。类似的方法简单得多,并且在不使用循环层的情况下也可以实现相同的效果:
public static string ProcessOperations(string numbers)
{
string[] numberArray;
string returnValue = string.Empty;
numberArray = numbers.Split(' ');
for (int i = 0; i < numberArray.Length - 2; i++)
{
if (int.TryParse(numberArray[i], out int a) &&
int.TryParse(numberArray[i + 1], out int b) &&
int.TryParse(numberArray[i + 2], out int c))
{
if (a + b == c)
returnValue += "addition, ";
else if (a - b == c)
returnValue += "subtraction, ";
else if (a * b == c)
returnValue += "multiplication, ";
else if (a / b == c)
returnValue += "division, ";
}
}
returnValue = returnValue.TrimEnd(new[] { ',', ' ' });
return returnValue;
}
这使用了一个运行到末端位置-2的单回路。然后,它将位置i
、i+1
和i+2
处的项目解析为a
、b
和c
)。然后,它检查哪个算术运算用于从a
和b
计算c
在返回之前有一个TrimEnd
,用于删除任何虚假的逗号和空格
注意:没有错误检查,没有算术运算会给出结果。除法是整数除法,因此不适用于浮点数。类似的方法简单得多,并且在不使用循环层的情况下也可以实现同样的效果:
public static string ProcessOperations(string numbers)
{
string[] numberArray;
string returnValue = string.Empty;
numberArray = numbers.Split(' ');
for (int i = 0; i < numberArray.Length - 2; i++)
{
if (int.TryParse(numberArray[i], out int a) &&
int.TryParse(numberArray[i + 1], out int b) &&
int.TryParse(numberArray[i + 2], out int c))
{
if (a + b == c)
returnValue += "addition, ";
else if (a - b == c)
returnValue += "subtraction, ";
else if (a * b == c)
returnValue += "multiplication, ";
else if (a / b == c)
returnValue += "division, ";
}
}
returnValue = returnValue.TrimEnd(new[] { ',', ' ' });
return returnValue;
}
这使用了一个运行到末端位置-2的单回路。然后,它将位置i
、i+1
和i+2
处的项目解析为a
、b
和c
)。然后,它检查哪个算术运算用于从a
和b
计算c
在返回之前有一个TrimEnd
,用于删除任何虚假的逗号和空格
注意:没有错误检查,没有算术运算会给出结果。除法是整数除法,因此不适用于浮点数。我将尝试修复此除法。我将尝试修复此除法。