J'ai une boucle for qui vérifie si un nombre est un facteur d'un nombre, puis vérifie si ce facteur est premier, puis il l'ajoute à un tableau. Selon le numéro d'origine, j'obtiendrai une erreur disant
erreur fatale: impossible de former une plage avec fin <début
Cela se produit presque à chaque fois, mais pour certains chiffres, cela fonctionne bien. Les seuls chiffres que j'ai trouvés pour travailler avec lui sont 9, 15 et 25.
Voici le code:
let num = 16 // or any Int
var primes = [Int]()
for i in 2...(num/2) {
if ((num % i) == 0) {
var isPrimeFactor = true
for l in 2...i-1 {
if ((i%l) == 0) {
isPrimeFactor = false;
}//end if
}//end for
if (isPrimeFactor == true) {
primes.append(i)
}//end if
}//end if
}//end for
Si vous avez besoin d'une boucle avec une plage de valeurs dynamique, je suggère d'utiliser stride(to:by:)
au lieu de ..<
ou ...
Fondamentalement ..<
ou ...
sera bloqué si start_index > end_index
.
Ex:
let k = 5
for i in 10...k { print("i=\(i)") }
for i in 10..<k { print("i=\(i)") }
Comment réparer:
// Swift 2.3
let k = 5
for i in 10.stride(to: k+1, by: 1) { print("i=\(i)") }
for i in 10.stride(to: k, by: 1) { print("i=\(i)") }
// Swift 3.0
let k = 5
for i in stride(from: 10, through: k, by: 1) { print("i=\(i)") }
for i in stride(from: 10, to: k, by: 1) { print("i=\(i)") }
REMARQUE: 2 blocs au-dessus n'imprimera rien, mais l'un d'eux se bloquera lors de l'exécution. Si vous souhaitez passer d'un nombre supérieur à un nombre inférieur, le paramètre by
doit être modifié en un nombre négatif .
Référence:
Dans votre deuxième boucle, i
commencera toujours à 2, ce qui signifie que vous bouclez depuis 2...1
SWIIFT 4
La meilleure façon de procéder est d'utiliser stride comme sur cette page de documentation: Stride de la fonction générique (de: à: par:)
for i in stride(from: 10, through: 5, by: -1) { print(i) }
et avancez si vous voulez inclure la limite inférieure: enjambée de la fonction générique (de: à: par:)