как распечатать сумму / среднее значение четных чисел массива и сумму / среднее значение нечетных чисел?

#swift

#swift

Вопрос:

 var a = [32,37,68,66,97,38,16,86,35,58]
  

Я хочу знать,
как напечатать сумму и среднее значение четного числа, сумму и среднее значение нечетного числа

Комментарии:

1. Если вы покажете нам, что вы уже пробовали, мы поможем вам исправить это или направить вас в правильном направлении.

Ответ №1:

O (n)

Вы можете сделать это за один раз :

 let (oddsSum, oddsCount, evensSum, evensCount) = a.reduce(into:(0, 0, 0, 0)) { tuple, element in
    if element % 2 != 0 {
        tuple.0  = element
        tuple.1  = 1
    } else {
        tuple.2  = element
        tuple.3  = 1
    }
}

let oddsAverage = oddsCount == 0 ? 0.0 : Double(oddsSum) / Double(oddsCount)
let evensAverage = evensCount == 0 ? 0.0 : Double(evensSum) / Double(evensCount) 
  

Что даст следующие результаты :

oddsSum // 169
oddsAverage // 56.33333333333334 
Четная сумма //364 
evensAverage // 52

Два массива

Вы можете создать два массива коэффициентов и четных чисел следующим образом :

 let a = [32, 37, 68, 66, 97, 38, 16, 86, 35, 58]

let (odds, evens) = a.reduce(into:([Int](), [Int]())) { tuple, element in
    if element % 2 != 0 {
        tuple.0.append(element)
    } else {
        tuple.1.append(element)
    }
}
  

odds и evens два массива целых чисел : [Int] .


Суммы

Для вычисления сумм :

 let oddsSum = odds.reduce(0,  )           //169
let evensSum = odds.reduce(0,  )          //364
  

Вы также можете использовать cblas_dasum(_:_:_:) фреймворк Accelerate, который быстрее, чем reduce :

 import Accelerate

var (odds, evens) = a.reduce(into:([Double](), [Double]())) { tuple, element in
    if element % 2 != 0 {
        tuple.0.append(Double(element))
    } else {
        tuple.1.append(Double(element))
    }
}

var oddSum = Int(cblas_dasum(Int32(odds.count), amp;odds, 1))
print(oddSum)     //169

var evenSum = Int(cblas_dasum(Int32(evens.count), amp;evens, 1))
print(evenSum)    //364
  

Средние значения

Средние значения — это суммы, деленные на количество элементов в каждом массиве.

 let oddsAverage = odds.isEmpty ? 0.0 : Double(oddsSum) / Double(odds.count)    //56.33333333333334
let evensAverage = evens.isEmpty ? 0.0 : Double(evensSum) / Double(evens.count) //52
  

Или вы можете использовать vDSP_meanvD(_:_:_:_:) из Accelerate framework, что быстрее, чем вычисление суммы и последующее деление на количество :

 import Accelerate

var (odds, evens) = a.reduce(into:([Double](), [Double]())) { tuple, element in
    if element % 2 != 0 {
        tuple.0.append(Double(element))
    } else {
        tuple.1.append(Double(element))
    }
}

var oddAvg = 0.0
vDSP_meanvD(amp;odds, 1, amp;oddAvg, vDSP_Length(odds.count))
print(oddAvg)     //56.333333333333336

var evenAvg = 0.0
vDSP_meanvD(amp;evens, 1, amp;evenAvg, vDSP_Length(evens.count))
print(evenAvg)    //52.0
  

Ответ №2:

Добавьте расширение, подобное этому

 extension Sequence where Self.Element == Int {
    var sum: Int {
        return self.reduce(0, { $0   $1 })
    }
}
  

затем сделайте это:

 var a = [38,97,25,66,90,31,16,86,33,59]
var evens = a.filter({ ($0 % 2) == 0 })
var odds = a.filter({ ($0 % 2) != 0 })

print(evens.sum)
print(odds.sum)
  

Комментарии:

1. После публикации этого я понял, что, вероятно, выполняю чью-то домашнюю работу.

2. Мне нравится многословие 🙂

3. Это не дает среднего значения.

4. Ах, извините. нужно разделить на количество 🙂

5. В любом случае, там около 90%, и я почти уверен, что это чужая домашняя работа, поэтому, если вы не можете взять ее оттуда и выяснить, как получить среднее значение, тогда вы заслуживаете неудачи.

Ответ №3:

Без расширения, так что, возможно, новичкам будет проще понять, вот как я бы это сделал:

 let oddElements = a.filter{$0 % 2 == 0}
let evenElements = a.filter{$0 % 2 != 0}

let oddElementsSum = oddElements.reduce(0, {$0   $1})
let oddElementsAverage = oddElementsSum / oddElements.count

let evenElementsSum = evenElements.reduce(0, {$0   $1})
let evenElementsAverage = evenElementsSum / evenElements.count
  

Можно сделать операторы сокращения немного короче с помощью

 let oddElementsSum = oddElements.reduce(0, { })
let evenElementsSum = evenElements.reduce(0, { })
  

Затем вы можете печатать через

 print (oddElementsSum)
print (oddElementsAverage)
print (evenElementsSum)
print (evenElementsAverage)