我似乎在使用var的算术运算中找不到准确的结果Int64。我需要做的平均值两者的Int64值。
static void Main(string[] args)
{
Int64 avg
int testCase = 0;
testCase = int.Parse(Console.ReadLine());
for (int i = 0; i < testCase; i++)
{
string[] str = Console.ReadLine().Split();
avg = ( ( Int64.Parse( str[0] ) + Int64.Parse( str[1] ) ) / 2 );
Console.WriteLine(avg);
}
}
Run Code Online (Sandbox Code Playgroud)
输入: str[0] == 9082296538332151448 str[1] == 5601337573664003844
输出: -1881554980856698162
为什么产生负数。试图找到平均值
您有整数溢出:
9082296538332151448 + 5601337573664003844 > Int64.MaxValue
Run Code Online (Sandbox Code Playgroud)
即
14683634111996155292 > 9223372036854775807
Run Code Online (Sandbox Code Playgroud)
您可以在这种情况下使用checked关键字抛出异常(ArithmeticException)(并知道发生了问题):
avg = checked( ( Int64.Parse( str[0] ) + Int64.Parse( str[1] ) ) / 2 );
Run Code Online (Sandbox Code Playgroud)
如果两个str[0]并str[1]保证是等于或小于Int64.MaxValue,你可以把它看成
Int64 arg1 = Int64.Parse(str[0]);
Int64 arg2 = Int64.Parse(str[1]);
arg = checked(arg1 / 2 + arg2 / 2 + (arg1 % 2 + arg2 % 2) / 2);
Run Code Online (Sandbox Code Playgroud)
在一般情况下,可能是这样的:
Int64[] data = ...
Int64 average = 0;
Int64 rem = 0;
foreach (var item in data) {
rem += item % data.Length;
average += item / data.Length + rem / data.Lenth;
rem %= data.Lenth;
}
if (rem > data.Length % 2L)
average += 1;
else if (-rem > data.Length % 2L)
average -= 1;
Run Code Online (Sandbox Code Playgroud)
最后,另一种(较慢但通用的)可能性是使用BigIntegers代替Int64:
using System.Numerics;
...
avg = (Int64)( ( BigInteger.Parse( str[0] ) + BigInteger.Parse( str[1] ) ) / 2 );
Run Code Online (Sandbox Code Playgroud)