2009-06-06 17 views
6

C# ile büyük tam sayıları nasıl ele alabilirim?C# içinde "Büyük" Tamsayıları Kullanma #

private static int GetDivisorProduct(int N, int product) 
    { 
     for (int i = 1; i < N; i++) 
     { 
      if (N % i == 0) 
      { 
       Console.WriteLine(i.ToString()); 
       product *= i; 
      } 
     } 

     return product; 
    } 

çağıran fonksiyon Ben sadece son 4 rakamını elde etmelidir, sonuç büyük 4'ten basamak ise GetDivisorProduct(N, 1)

geçerli:

Bana bölenler ürünü verecek bir fonksiyonu var . (Ör. 957 girdisi verirse, çıktı sadece son dört değeri kırptıktan sonra 7493'tür. Gerçek sonuç 876467493'tür.).

Diğer numune girişi: I 'in 10000 verir, çıkış 0

BigInteger C sınıfı # kütüphanesi kaldırıldı olduğunu!

Son dört rakamı nasıl alabilirim?

+0

İlgili soruya bakın: http://stackoverflow.com/questions/959923/handle-big-integers-in-c –

+3

Yani aynı soruyu mu görmek istiyorsunuz? – heavyd

cevap

27

Sadece son dört haneye bakıyorsanız, tam sayıdan büyük bir şeye ihtiyacınız yoktur. Şunu bir düşünün:

sen (son dört basamak yani) en anlamlı basamağa sadece ilginizi çekiyorsa, iki sayının çarpımı, ardından en üstündeki hane sonucun en düşük basamak üzerinde etkisi olmayacaktır. ..'u çarpmadan önce "" "en önemli (sağ taraf) basamakları dışarı atabilirsiniz. Biz sadece son iki rakamlarını çarparsak

int num1 = 123456789; 
int num2 = 987654321; 

int result = num1 * num2; // Last two digits would be "69" but this OVERFLOWS 

ama ...:

Örneğin: İki çok sayıda çarpmak istiyorum ama sadece son iki basamağını ihtiyaç

int result = (num1 % 100) * (num2 % 100); // result = 89 * 21 

89 * 21 = 1869

(son iki basamak hala "" ama biz taştı değil).

Bu tekniği Six Right-Most Digits of 1,000,000 factorial hesaplamak için kullandım.

, Enjoy

Robert C. Cartaino

+7

Yep. Modüler aritmetik: (a * b)% m == ((a% m) * (b% m))% m –

+0

Bu uzun sarımlı örneğimi açıklamak için çok daha kısa bir yol. –

0

Ürün yerine int yerine çift veya uzun kullanmaya mı çalışıyorsunuz? Sadece bazı durumlarda çalışır, ancak yapabileceğiniz daha büyük sayılarla çalışmanızı sağlar.

+0

Daha önce çift, uzun vs. ile denedim. –

+0

Üzgünüm Daha fazla yardım edemedim! İyi şanslar! – Pwninstein

7

.NET 4.0 olan bir BigInteger sınıf

+0

Sweet - BigInteger sınıfı hakkında bilmiyordum! – TWith2Sugars

+2

OP, BigInteger'i hiç kullanmamalıdır. Robert'ın cevabına bakın. –

0

ben missunderstood vermedi umuyoruz, ancak "0000" Konsolu yazmak istiyorum sonuç 0 ise? Denediniz mi:

Console.WriteLine(i.ToString().PadLeft(4,"0")); 

?

İstediğiniz şey 0000 sayısını int olarak almaksa, üzgünüm, ama nasıl yapacağımı bilmiyorum.

+0

Bu şekilde yaptım .. ama hiç de uygun bir çözüm değil. Gerçekten öyle mi? –

1

Eh, böyle kodunuzu değiştirebilirsiniz: (10000 * k + l) R son dört rakamı R. fiili tip l aynıdır çünkü

for (int i = 1; i < N; i++) 
    { 
     if (N % i == 0) 
     { 
      Console.WriteLine(i.ToString()); 
      product *= i; 
     } 
     if (product > 10000 * N) 
     { 
      product %= 10000; 
     } 
    } 

budur Ürün, işlemek istediğiniz N'nin aralığına bağlıdır. Tamsayı tipi ise, ürün uzun olmalıdır.

Bu arada, neden her zaman 1 ise, ürünü parametre olarak aktarıyorsunuz?