Страницы: 1
RSS
Как посчитать возможные варианты номера банковской карты при недостающих цифрах, Разминка для матиматиков
 
Добрый день!

Видимо нейронные связи уже не те, поэтому прошу содействия знатоков)

Дано: неполный номер банковской карты формата 1234 56ХХ ХХХХ 7890
Требуется выдать все возможные варианты написания.  Сколько их будет всего?

И конечно с использованием алгоритма Луна, чтобы варианты были реальными. То есть в идеале видится ексель файл, куда забиваются имеющиеся числа, а файл выдает все возможные варианты.
по ощущениям вариантов около тысячи
Изменено: vikttur - 14.07.2021 17:51:55
 
эээ... 10^6 = 1 000 000 (от 000000 до 999999) нет?
Соблюдение правил форума не освобождает от модераторского произвола
 
Код
Sub bank_card()
i = 1
Application.ScreenUpdating = False
For f = 0 To 9
    For e = 0 To 9
        For d = 0 To 9
            For c = 0 To 9
                For b = 0 To 9
                    For a = 0 To 9
                        Cells(i, 1).Value = "1234 56" & a & b & " " & c & d & e & f & " 7890"
                        i = i + 1
                    Next a
                Next b
            Next c
        Next d
    Next e
Next f
Application.ScreenUpdating = True
End Sub

Супер медленный вариант.
 
buchlotnik , не, надо алгоритм Луна учитывать, чтобы номера были рабочие)

whateverlover, это без Луна похоже?)
Изменено: vikttur - 14.07.2021 17:49:24
 
Да, без Луна
Код
Sub bank_card()
i = 1
Application.ScreenUpdating = False
For f = 0 To 9
    For e = 0 To 9
        For d = 0 To 9
            For c = 0 To 9
                For b = 0 To 9
                    For a = 0 To 9
                        chislo = "481776" & a & b & c & d & e & f & "2826"
                        If ValidateLuhn(chislo) = True Then
                            Cells(i, 1).Value = chislo
                            i = i + 1
                         End If
                    Next a
                Next b
            Next c
        Next d
    Next e
Next f
Application.ScreenUpdating = True
End Sub

Function ValidateLuhn(ByVal oCell As String) As Boolean
Dim i As Long, j As Long, k As Long, StrTmp As String
ValidateLuhn = False
StrTmp = Replace(Replace(oCell, " ", ""), "-", "")
If IsNumeric(StrTmp) Then
  Select Case Len(StrTmp)
    Case 14: If Left(StrTmp, 1) <> 3 Then Exit Function
    Case 15 'Amex
      If Left(StrTmp, 1) <> 3 Then Exit Function
      StrTmp = "0" & StrTmp
    Case 16
      If (Left(StrTmp, 1) < 4) Or (Left(StrTmp, 1) > 6) Then Exit Function
    Case Else: Exit Function
  End Select
  For i = 1 To Len(StrTmp)
    j = Mid(StrTmp, i, 1) * (i Mod 2 + 1)
    k = k + Int(j / 10) + j Mod 10
  Next
  If k Mod 10 = 0 Then ValidateLuhn = True
End If
End Function

Т.к. я не знаю ничего про этого Луну, не могу ничего сказать про корректность результатов (нашел в интернете функцию).
На Вашем примере валидных карт получилось ноль.
На примере 4817 76ХХ ХХХХ 2826 - 100 000 карт.
Изменено: vikttur - 14.07.2021 17:50:16
 
В задаче 123456ХХХХХХ7890 для демонстрации формата. те. вторые шесть цифр из 16 отсутствуют. такого номера карты в реальности быть не может, да.

Для наглядности давайте возьмем ваши цифры. По алгоритму Луна сумма всех слагаемых кратна 10. Присутствующая часть равна 58. Соответственно,

сумма отсутствующих заканчивается на 2. Возможно 2, 12, 22, 32, 42, 52. (максимум 54- шесть отсутствующих- девятки).

Промежуточным ответом будет вычисление количества вариантов. Для 2 - 000002, 000020, 000200, 002000, 020000, 200000, 100001, 100010, 100100, 101000, 110000, 010001, и тд.
Страницы: 1
Наверх