C# i duże liczby (nie cyfry)

0

Witam. Mam problem z utworzeniem progrmamu.
Program ma pytac o nr 30 znakowy i na nim wykonac operacje matematyczna reszty z dzielenia przez 97.Wiem ze te dzialanie to mod97 tylko nie moge przypisac tej zmiennej w int wpisywalem zmienna w postaci stringa i potem probowalem konwertowac na strtoint i nic. prosze o pomoc i z gory dziekuje

0

A więc chcesz zapisać 999999999999999999999999999999 do typu int, podczas gdy zakres najdłuższej zmiennej całkowitej w C# to 18.446.744.0.73.709.551.615(źródło: http://si-szarp.pl/kurs/zmienne)? Poczytaj na temat bignumów i operacji matematycznych na stringach.
P.S.
Popraw tytuł na "Operacje na dużych liczbach".

Edit:
Możesz też spróbować użyć tego: http://bit.ly/1pYE3je.

1
Ksiegowy333 napisał(a):

Program ma pytac o nr 30 znakowy i na nim wykonac operacje matematyczna reszty z dzielenia przez 97

to brzmi jak wyliczanie sumy kontrolnej numeru IBAN
nie potrzebujesz do tego żadnych bigintów ani operacji na dużych liczbach, są do tego gotowe algorytmy
jeden znajdziesz choćby na stronie banku polskiego: http://www.nbp.pl/home.aspx?f=systemplatniczy/regulacje/zarzadzenie_05_2002_zal_1.html

za pomocą wag możesz obliczyć sumę modulo
na necie znajdziesz też inne algorytmy; żaden nie potrzebuje operacji bezpośrednio na dużych liczbach

0

@sgageryr - dokładnie, najpewniej do wyliczania sumy kontrolnej numeru IBAN lub NRB; Niedawno robiłem funkcje sprawdzające poprawność polskich numerów, tyle że nie bawiłem się w typy liczbowe, tylko skorzystałem ze zwykłych łańcuchów znaków i metody wielomianowej;


Przykład w Object Pascalu, ale bardzo łatwy do przetłumaczenia:

function IsValidNRBorIBANNumber(const AValue: AnsiString): Boolean;
const
  MOD97_VALUES: array [0 .. 29] of Integer = (
     1, 10,  3, 30,  9, 90, 27, 76, 81, 34, 49,  5, 50, 15, 53,
    45, 62, 38, 89, 17, 73, 51, 25, 56, 75, 71, 31, 19, 93, 57
  );
const
  COUNTRY_NUMBER = AnsiString('2521'); { 'PL': 'P' = 25, 'L' = 21 }
var
  strNRB: AnsiString;
  intSum: Integer = 0;
  I: Integer;
begin
  SetLength(strNRB, 30);
  Move(AValue[3], strNRB[1], 24);
  Move(COUNTRY_NUMBER[1], strNRB[25], 4);
  Move(AValue[1], strNRB[29], 2);

  for I := 0 to 29 do
    Inc(intSum, (Ord(strNRB[30 - I]) - 48) * MOD97_VALUES[I]);

  Result := (intSum mod 97) = 1;
end;

Działa poprawnie dla podanego w argumencie AValue ciągu 26 cyfr.

2

Jeśli cyfry są za duże, to trzeba zmienić rozmiar fontu. Wersja hardcorowa - nauczyć się odróżniać cyfry od liczb.

0

Robie kalkulator naukowy do 50 cyfr i nic mu to nie da sprawdzanie iban.
Niestety jest te ograniczeine. O Biginteger wiem wlasnie ale nie wiem jak to zrobic.

0
using System;
using System.Numerics;

namespace ConsoleApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         var value = "90315837410815837410891583741089963120710020880371400004554";
         var number = BigInteger.Parse(value);
         Console.WriteLine(number / 100);
         Console.WriteLine(number % 100);
      }
   }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1