Как разделить целое число - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь создать аддитивную постоянную программу, в которой пользователь вводит число, а программа выводит общее количество итераций (или аддитивная персистентность).

Я хочу закодировать его чтобы я не использовал строковый тип данных.
Существуют ли какие-либо встроенные функции или иным образом, которые я могу использовать, чтобы разделить большое число на отдельные цифры?

Что следует отметить:

  1. Я кодирую в консольном приложении на VB. Net
  2. Я относительно новичок в кодировании

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Чтобы получить последний ди git числа в базе 10, вы можете использовать оператор по модулю, известный как Mod, таким образом:

1234 Mod 10 = 4
32 Mod 10 = 2

и т. Д. on.

Когда у вас есть последний di git, его по сути можно отрубить с помощью целочисленного деления:

1234 \ 10 = 123
32 \ 10 = 3

Так что теперь процесс можно повторить, чтобы получить то, что имеет стать последним ди git. Как только исходное число было уменьшено до 0, алгоритм завершил работу.

Поскольку вам не нужны цифры в каком-либо конкретном порядке, нам не нужно об этом беспокоиться.

Итак, учитывая:

Function GetDigits(n As Int64) As List(Of Int64)
    Dim digits As New List(Of Int64)
    While n > 0
        digits.Add(n Mod 10)
        n = n \ 10
    End While

    Return digits

End Function

Вы можете сделать:

Console.WriteLine(String.Join(" ", GetDigits(12345678900)))

, чтобы получить результат:

0 0 9 8 7 6 5 4 3 2 1

Я использовал Int64 (он же Long) для параметра GetDigits, чтобы вы могли использовать числа с большим количеством цифр, чем Int32 (он же Integer) можно удерживать.

От этого вы можете:

Function AdditivePersistence(n As Int64) As Integer
    Dim pers = 0
    While n > 9
        pers += 1
        n = GetDigits(n).Sum()
    End While

    Return pers

End Function
0 голосов
/ 11 февраля 2020

Вы можете сделать это, используя LINQ с математическими функциями.

Function getSum(number As Integer) As Integer
    Return CInt(Enumerable.Range(0, CInt(Math.Round(Math.Log10(number), 0)) + 1).
                Select(Function(i) Math.Truncate(number / (10 ^ i)) Mod 10).Sum())
End Function
  • Enumerable.Range: создает целые числа от 0 до log10 числа. Это количество цифр - 1.
  • Выбор: делит число на (10 ^ целое число), удаляет десятичные дроби, выполняет по модулю 10, чтобы получить только одну часть.
  • Сумма: суммы эти числа

Поместите это в al oop в функции, которая подсчитывает, сколько раз мы вызывали функцию, пока результат не будет <9 </p>

Function persistence(number As Integer) As Integer
    Dim count = 0
    Console.WriteLine($"Original Number: {number}")
    Do
        number = getSum(number)
        Console.WriteLine($"Number: {number}")
        count += 1
    Loop While number > 9
    Console.WriteLine($"Persistence: {count}")
    Return count
End Function
persistence(2718)

Оригинальный номер: 2718
Номер: 18
Номер: 9
Постоянство: 2

Проще с строками. Хотя вы сказали, что не хотите использовать строки, вот решение с ними.

Function getSum(number As Integer) As Integer
    Return number.ToString().Sum(Function(c) CInt(c.ToString()))
End Function
  • Преобразовать отдельные символы в строке числа в числа и суммировать их.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...