SORU
30 Mayıs 2014, Cuma


3 uzun ortalama tamsayılar

Çok büyük 3 imzalı tamsayı var.

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

Kesilmiş onların ortalamasını hesaplamak istiyorum. Beklenen ortalama değer 9223372036854775806 long.MaxValue - 1,.

İmkansız olarak hesaplamak için:

long avg = (x   y   z) / 3; // 3074457345618258600

Not: tüm bu sorular 2 Sayı ortalama okudum, ama bu tekniği 3 Sayı ortalama uygulanabilir görmüyorum.

BigInteger, kullanımı çok kolay ama onu kullan olamaz varsayalım.

BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx   by   bz) / 3; // 9223372036854775806

Eğer 13**, o zaman, tabii ki ben dönüştürmek, hassas kaybediyorum.

double dx = x;
double dy = y;
double dz = z;
double davg = (dx   dy   dz) / 3; // 9223372036854780000

Eğer decimal, ben dönüştürmek çalışır, ama aynı zamanda ben de edemiyor bu izin kullanın.

decimal mx = x;
decimal my = y;
decimal mz = z;
decimal mavg = (mx   my   mz) / 3; // 9223372036854775806

Soru:Bir şekilde 3 long yazın kullanımı ile çok büyük tamsayılar kesilmiş ortalama hesaplamak için var mı? C olarak bu soruyu düşünmüyoruz özel#sadece bana C örneklerini sağlamak için daha kolaydır#.

CEVAP
30 Mayıs 2014, Cuma


Bu kod çalışır, ama o kadar hoş değil.

İlk üç değerleri böler (bu değerler, çok katlı '' kalan) kaybetmek, ve sonra geri kalan: böler

long n = x / 3
           y / 3
           z / 3
           ( x % 3
               y % 3
               z % 3
           ) / 3

Yukarıdaki örnek her zaman bir veya daha fazla negatif değerlere sahip düzgün çalışmıyor unutmayın.

Yorum sayısı aşağıda patlayan olduğundan Ulugbek ile görüştü, burada pozitif ve negatif değerleri için geçerli en İYİ çözümdür.

Bu geçerli bir çözümUlugbek Umirov, James S, , *, *24KevinZMarc van Leeuwen cevaplar ve yorumlar için teşekkürler

static long CalculateAverage(long x, long y, long z)
{
    return (x % 3   y % 3   z % 3   6) / 3 - 2
              x / 3   y / 3   z / 3;
}

static long CalculateAverage(params long[] arr)
{
    int count = arr.Length;
    return (arr.Sum(n => n % count)   count * (count - 1)) / count - (count - 1)
             arr.Sum(n => n / count);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • metal571

    metal571

    30 Mayıs 2006
  • UniqueApps

    UniqueApps

    4 Ocak 2009
  • WoodysGamertag

    WoodysGamert

    17 Aralık 2009