【问题标题】:for loop to check if a number in array divides all elements in arrayfor循环检查数组中的数字是否除以数组中的所有元素
【发布时间】:2020-08-03 06:19:52
【问题描述】:

我不熟悉编码和堆栈溢出。我只是想看看解决这个问题的最佳方法是什么。

我的方法// 运行一个 for 循环,如果它正在划分所有元素,则将数字分配给一个变量。问题是我无法正确表示 for 循环。我的方法错了吗?你会用字典代替吗? 我只需要方法和循环谢谢!

最大公约数 (GCD),也称为 N 个数的最大公因数 (HCF),是除所有数而没有余数的最大正整数。编写一个算法来确定 N 个正整数的 GCD。

func generalizedGCD(num:INT, arr:[Int])->Int

num- 表示正整数个数的整数(N),arr - 正整数列表

输入/num = 5, arr = [2,4,6,8,10]输出/2

输入/num = 5, arr = [2,3,4,5,6]输出/1

【问题讨论】:

标签: ios swift


【解决方案1】:

需要注意的是,一个质数可能会在gcd中多次进入,因此需要一些重复循环......

let arr = [4, 8, 12] // [2,4,6,8,10]

// 1. build the list of prime numbers (up to 100 is enough to test GCD of numbers upto 10_000). You could also build this list by code.
let primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

// 2. Find the min in your array. No need to test divisor beyond the min, to speed up
var minimum = arr.min() ?? 1

// 3. Loop through primes to test as divisor or minumum element
var goOn = true
var possibleDivisors : [Int] = []
for prime in primes where minimum > 1 {
    var primeAtPower = 1
    repeat {        // A same prime may be multiple times in gcd. ex: arr = [4, 8, 12]: 2 will appear twice as divisor of 4
        if minimum % prime == 0 {
            primeAtPower *= prime
            minimum /= prime
        } else {
            goOn = false
        }
        goOn = goOn && minimum > 1
    }
    while goOn
    possibleDivisors.append(primeAtPower)
}
    
var gcd = 1 // Initialize
for divisor in possibleDivisors {
    var possibleDivisor = true
    for val in arr where possibleDivisor {
        if val % divisor != 0 { possibleDivisor = false }
    }
    // 4. If common divisor, gcd includes it
    if possibleDivisor { gcd *= divisor }
}
print("gcd of \(arr) is", gcd)

产量

[4, 8, 12] 的 gcd 为 4

【讨论】:

  • 非常感谢。虽然有点长。我将不得不了解您使用的一些方法,但我很乐意这样做。
  • 也感谢您对整个代码的解释。很有帮助!!!
  • 我看了一点。评论中有一个错误:这将测试最多 100 的数字,而不是 10000。您可以在 append 之前添加一个测试: if primeAtPower > 1 { possibleDivisors.append(primeAtPower) }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多