我试图做一个排列.在这种情况下五个,所以5,4,3,2,1.最终我希望它可以置换到100,这可以存储在我的intX类中.计算很好,但我想使用下面的脚本添加输出的所有单个数字.
所以5!= 5x4x3x2x1 = 120 ----> 1 + 2 + 0 = 3.但我的下面的脚本给出了输出147:
120
1
2
0
147
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我已经尝试了所有的转换器,我开始只使用字符串[指针]东西,我尝试了不同的数组等..但它一直在提出147.它是某种表示的东西?
static void Main(string[] args)
{
IntX total=1;
IntX totalsum = 0;
int perm = 5;
for (int i = perm; i > 0; i--)
{
total = total * i;
}
Console.WriteLine(total);
string answerstring = Convert.ToString(total);
char[] answerArray = answerstring.ToArray();
for (int x = 0; x < answerArray.Length; x++)
{
totalsum += Convert.ToInt32(answerArray[x]);
Console.WriteLine(answerArray[x]);
}
Console.WriteLine(totalsum);
}
Run Code Online (Sandbox Code Playgroud)
问题在于:
for (int x = 0; x < answerArray.Length; x++)
{
//Casting char to int, not what you want!
//totalsum += Convert.ToInt32(answerArray[x]);
//Parsing char to int, what you do want!
totalsum += int.Parse(answerArray[x]);
Console.WriteLine(answerArray[x]);
}
Run Code Online (Sandbox Code Playgroud)
问题是您将answerArray元素转换回数字的方式
Convert.ToInt32(answerArray[x])
Run Code Online (Sandbox Code Playgroud)
上面的行接受char 1并将其转换为int.这与将其解析为int不同.1是ascii字符49所以在内部char的int表示为49,因此它被转换为(因为这只是尝试进行类型转换而不是任何类型的处理)
同样地,2 = 50和0 = 48,所以你得到的总数为147.
你想要做的是使用Integer.Parse将字符串解析为数字.我相信它应该在解析之前隐式地将char转换为字符串.
所以你的循环将是:
for (int x = 0; x < answerArray.Length; x++)
{
totalsum += int.Parse(answerArray[x].ToString());
Console.WriteLine(answerArray[x]);
}
Run Code Online (Sandbox Code Playgroud)
您也可以像其他人建议的那样减去字符.这是有效的,因为ascii值为1比ascii值高1,2为2,等等.
当然这仅适用于单位数字符号.如果您想要将超过两位数的数字转换为您需要的字符串中的int int.parse.
值得我怀疑的是,字符减法方法是最有效的,因为它实际上只是做了一些非常简单的类型转换和减法.解析方法可能会做更多的东西,所以更重量级.我不会'你会注意到性能差异.