[Swift] boucle for

Bonjour, j'ai une simple question, j'avais un petit algorithme a faire dont voici l'énoncé : 



 


 


Complete the program which takes date in number format and then makes its addition of the digits until the
last digit remains single and the print the number as lucky number . eg if input is 777
then 7+7+7 =21 = 2+1 =3 so the answer is 3.
Example1:
Enter the date(ddmmyy):
131083
Your lucky number is:
7
Example2:
Enter the date(ddmmyy):
111111
Your lucky number is:
6

et j'ai plutot bien réussi mais quelque chose me gène, on peut forcément faire plus simple au niveau du code je parle mais comment [notamment au niveau des boucle for (il y a en 3 tout de même)]?


Merci d'avance.


 


voici le code : 



import Foundation

let nb = 111111
let nbString = "\(nb)"
var tab = [String]()
var subResult = 0
var finalResult = 0

for chr in nbString.characters{
tab.append(String(chr))
}

for (_,nb) in tab.enumerate(){
if let number = NSNumberFormatter().numberFromString(tab.removeLast())?.integerValue {
subResult += number
}
}

for chr in String(subResult).characters{
tab.append(String(chr))
if let number = NSNumberFormatter().numberFromString(String(chr))?.integerValue {
finalResult += number
}
}

print(finalResult)


Réponses

  • Nb % 10 te donne le dernier chiffre de ton nombre.

    Ensuite tu fais (nb - nb%10)/10 ou même juste nb/10 et tu itères.
  • J'avais pas pensé au modulo ! Merci !


     


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2016 modifié #4

    Beaucoup plus Swifty :



    let nombre = 98989856789

    var nombreStr = nombre.description

    var result = 0

    while nombreStr.characters.count > 1
    {
    let ints = nombreStr.characters.flatMap { Int(String($0)) }

    result = ints.reduce(0, combine: +)

    nombreStr = result.description
    }

    print(result)

  • CéroceCéroce Membre, Modérateur
    février 2016 modifié #5
    func luckyNumber(number: Int) -> Int {
    if(number < 10) {
    return number
    } else {
    return luckyNumber(number/10 + number%10)
    }
    }

    print(luckyNumber(131083))
    Recursivity Powa!!!
  • La numérologie, aussi fiable que l'astrologie, la cartomancie et l'examen des entrailles de poulets.




  • func luckyNumber(number: Int) -> Int {
    if(number < 10) {
    return number
    } else {
    return luckyNumber(number/10 + number%10)
    }
    }

    print(luckyNumber(131083))

    Recursivity Powa!!!

     




     


    +1.


     


    Mais attention aux récursivités non terminales (ce n'est pas le cas ici), car la pile d'exécution peut ne pas aimer  ;) (enfin dans ce cas d'usage c'est peu probable).

  • Joanna CarterJoanna Carter Membre, Modérateur

    C'est bon, si c'était vraiment un numéro mais les dates sont rarement saisi ou traitées comme numéros. Je crois qu'on les traite plutôt comme strings.


  • CéroceCéroce Membre, Modérateur

    car la pile d'exécution peut ne pas aimer  ;)

    La pile c'est dépassé, je code ma prochaine appli en Haskell ;-)
  • DrakenDraken Membre
    février 2016 modifié #10


    La pile c'est dépassé, je code ma prochaine appli en Haskell ;-)




    C'est une race de chiens, non ? On peut dresser des canidés à  faire des calculs ? C'est pour un cirque ? Un numéro avec des chiens jonglant avec des piles d'assiettes pour réaliser des calculs ? Après tout, on y arrive (plus ou moins) avec des bactéries. 


  • Jolin0558Jolin0558 Membre
    février 2016 modifié #11

    J'avais pas pensé au modulo ! Merci coque sony xperia m5 coque sony m5


Connectez-vous ou Inscrivez-vous pour répondre.