Average of 3 long integers

前端 未结 12 1726
我寻月下人不归
我寻月下人不归 2020-12-07 10:05

I have 3 very large signed integers.

long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;

I want to calculate th

12条回答
  •  爱一瞬间的悲伤
    2020-12-07 10:57

    You could use the fact that you can write each of the numbers as y = ax + b, where x is a constant. Each a would be y / x (the integer part of that division). Each b would be y % x (the rest/modulo of that division). If you choose this constant in an intelligent way, for example by choosing the square root of the maximum number as a constant, you can get the average of x numbers without having problems with overflow.

    The average of an arbitrary list of numbers can be found by finding:

    ( ( sum( all A's ) / length ) * constant ) + 
    ( ( sum( all A's ) % length ) * constant / length) +
    ( ( sum( all B's ) / length )
    

    where % denotes modulo and / denotes the 'whole' part of division.

    The program would look something like:

    class Program
    {
        static void Main()
        {
            List list = new List();
            list.Add( long.MaxValue );
            list.Add( long.MaxValue - 1 );
            list.Add( long.MaxValue - 2 );
    
            long sumA = 0, sumB = 0;
            long res1, res2, res3;
            //You should calculate the following dynamically
            long constant = 1753413056;
    
            foreach (long num in list)
            {
                sumA += num / constant;
                sumB += num % constant;
            }
    
            res1 = (sumA / list.Count) * constant;
            res2 = ((sumA % list.Count) * constant) / list.Count;
            res3 = sumB / list.Count;
    
            Console.WriteLine( res1 + res2 + res3 );
        }
    }
    

提交回复
热议问题