我从哪里开始?迅速

时间:2018-04-16 07:57:47

标签: swift logic

func step(_ g: Int, _ m: Int, _ n: Int) -> (Int, Int)? {
    var z = [m]
    var x = m
    var y = n
    while x < y {
        x += 1
        z += [x]
    }
    for i in z {
        var k = 2
        while k < n {

        if i % k != 0 && i != k {

            }
            k += 1
        }

    }
    print(z)
    return (0, 0)
}
print (step(2, 100, 130))

因此它当前以数组的形式返回数字100-130的集合。整体功能将比我要求的更多但是现在我只想创建一个数字,取数字100-130,或更具体地说数字x-y并返回一个素数数组。 if i%k部分需要帮助。是的,我知道它是多余的和拉长的,但我是新的。据说只是尝试使用简单的快捷方式。 据说我也可以通过各种方法来提高它的效率,但是我需要解释其中的一些,因为......我很新。对于上下文假设只是这样做了20-30天(一般编码)

3 个答案:

答案 0 :(得分:0)

你可以这样做:

let a = 102 
let b = 576 // two numbers you want  to check within

/**** This function returns your array of primes ****/
func someFunc(x: Int, y: Int) -> [Int] {
    var array = Array(x...y) // This is a quick way to map and create array from a range . /// Array(1...5) . ---> [1,2,3,4,5]

    for element in array {
        if !isPrime(n: element) { // check if numberis prime in a for loop
            array.remove(at: array.index(of: element)!) // remove if it isnt
        }
    }

    return array
}

someFunc(x: a, y: b) //this is how you call this func.  someFunc(x: 4, y: 8) ---> [5, 7]


// THis is a supporting function to find a prime number .. pretty straight forward, explanation in source link below.
func isPrime(n: Int) -> Bool {
    if n <= 1 {
        return false
    }
    if n <= 3 {
        return true
    }
    var i = 2
    while i*i <= n {
        if n % i == 0 {
            return false
        }
        i = i + 1
    }
    return true
}

来源:Check if a number is prime?

答案 1 :(得分:0)

首先,在可能的情况下将逻辑分离为函数是个好主意。例如。这是一个用于计算数字是否为素数的通用函数(改编自this answer):

func isPrime<T>(_ n: T) -> Bool where T: BinaryInteger {
    guard n > 1 else {
        return false
    }
    guard n > 3 else {
        return true
    }

    var i = T(2)
    while (i * i) <= n {
        if n % i == 0 {
            return false
        }
        i += 1
    }
    return true
}

要逐步获取数字,Swift提供stride功能。所以你的功能可以简化为:

func step(_ g: Int, _ m: Int, _ n: Int) -> (Int, Int)? {
    let z = stride(from: m, to: n, by: g).filter { isPrime($0) }
    print(z)
    return (0, 0)
}

要解释一下,stride将返回您想要单步执行的Sequence个数字,然后您可以filter仅获取那些返回true的数字传递给函数isPrime

顺便说一下,你print(step(2, 100, 130))的例子应该什么都不打印,因为你会检查从100到130的所有偶数,这显然是非素数。

我还建议您不要使用单字母变量名。 gmnz不具有描述性。您希望清晰简洁,以便其他人能够理解您的代码。

答案 2 :(得分:0)

这将返回两个数字之间的素数数组:

module.exports = function(config) {
  config.set({
  files: [
    'path-to-angular.js',
    'www/js/services/api.service.js',
    'test/**/*.test.js'
  ],
 })
} 

在扩展名中,你基本上循环遍历2和所选数字/ 2之间的每个数字,以检查它是否可分,如果是,则返回false,否则返回true。

extension Int { func isPrime() -> Bool { if self <= 3 { return self == 2 || self == 3 } for i in 2...self/2 { if self % i == 0 { return false } } return true } } func getPrimes(from start: Int, to end: Int) -> [Int] { var primes = [Int]() let range = start > end ? end...start : start...end for number in range { if number.isPrime() { primes.append(number) } } return primes } 基本上包含2个数字,如果起始编号高于他们切换的结束编号(故障安全)。然后你只需要在扩展名的帮助下检查数字是否为素数,如果它是素数,则将值附加到数组。

getPrimes()

如果您想采取高于func step(_ steps: Int, _ start: Int, _ end: Int) { var primes = [Int]() var number = start repeat { if number.isPrime() { primes.append(number) } number+=steps } while number <= end }

的差异,请执行以下其他功能