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
C# i duże liczby (nie cyfry)
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
- Postów: 99
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2412
- Rejestracja: dni
- Ostatnio: dni
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
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Tuchów
- Postów: 12270
@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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
Jeśli cyfry są za duże, to trzeba zmienić rozmiar fontu. Wersja hardcorowa - nauczyć się odróżniać cyfry od liczb.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Polska, Kraków
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);
}
}
}