Целые числа больше, чем Int64

Я пытаюсь получить номер ввода пользователя и найти сумму всех цифр. Однако у меня возникают проблемы с большими числами, поскольку они не регистрируются в Int64. Любая идея относительно того, какие структуры я мог бы использовать для хранения значения? (Я пробовал UInt64, и это не очень хорошо работало с негативами, однако я бы предпочел что-то большее, чем UInt64, в любом случае. Мне трудно реализовать UInt128 из Есть ли числовой тип с большей емкостью, чем u_long/UInt64 в Swift? )

import Foundation

func getInteger() -> Int64 {
var value:Int64 = 0

while true {

    //we aren't doing anything with input, so we make it a constant
    let input = readLine()

    //ensure its not nil
    if let unwrappedInput = input {
        if let unwrappedInt = Int64(unwrappedInput) {
            value = unwrappedInt
            break
        }
    }
    else { print("You entered a nil. Try again:") }
}
return value
}
print("Please enter an integer")
// Gets user input
var input = getInteger()
var arr = [Int] ()
var sum = 0
var negative = false
// If input is less than 0, makes it positive
if input < 0 {
input = (input * -1)
negative = true
}
if (input < 10) && (input >= 1) && (negative == true) {
    var remain = (-1)*(input%10)
    arr.append(Int(remain))
    input = (input/10)
}
else {
    var remain = (input%10)
    arr.append(Int(remain))
    input = (input/10)
}
}
// Adds numbers in array to find sum of digits
var i:Int = 0
var size:Int = (arr.count - 1)
while i<=size {
sum = sum + arr[i]
i = (i+1)
}
// Prints sum
print("\(sum)")

person R. R    schedule 18.06.2017    source источник
comment
Рассматривали ли вы возможность использования NSDecimalNumber в соответствии с рекомендациями этот ответ в посте, на который вы ссылаетесь? Он может обрабатывать числа в форме A*10^B, где B — до 127.   -  person Arc676    schedule 18.06.2017
comment
Как насчет того, чтобы просто прочитать это как строку?   -  person vacawama    schedule 18.06.2017
comment
@ Arc676 - Просто чтобы установить соответствующие ожидания, мантисса может иметь длину 38 цифр, поэтому, если вам нужна целочисленная точность, немного вводит в заблуждение предположение, что B составляет до 127. Это максимум 38 цифр, а затем вы начинаете терять точность.   -  person Rob    schedule 18.06.2017


Ответы (1)


Вы можете использовать строку для выполнения описанной вами операции. Переберите каждый символ, преобразуйте его в целое число и добавьте к сумме. Будьте осторожны, чтобы обрабатывать ошибки.

person logan rakai    schedule 18.06.2017
comment
Я пытался получить пользовательский ввод в виде строки, как было предложено, но я не могу преобразовать строку пользовательского ввода (введите inout String) в целое число или строку. - person R. R; 18.06.2017
comment
Вам нужно будет преобразовать каждый символ в int. Пример того, как перебирать символы и преобразовывать их в целое число, приведен здесь: stackoverflow.com/a/30771177/5894196. Даже если это inout, вы все равно можете использовать свойство characters. - person logan rakai; 19.06.2017