Проверить лежат ли в массиве числа Фибоначчи
Всем привет! Имеется массив целых чисел, и мне нужно сделать проверку, соответствуют ли элементы массива числам Фибоначчи. Если соответствуют я делаю Array.Reverse(). Как мне сделать такую проверку?
Ответы (2 шт):
Автор решения: Mical
→ Ссылка
public static bool FibonacciEquals(int[] row)
{
for (int i = 0; i < row.Length - 2; i++)
if (row[i] + row[i + 1] != row[i + 2])
return false;
return true;
}
Такой метод работает, даже если ряд начинается не с 0, 1. Но главное, чтобы числа были именно по порядку и без случайных чисел между нужными. То есть, просто ряд фибоначчи.
Автор решения: Stanislav Volodarskiy
→ Ссылка
MakeFibs строит множество всех чисел Фибоначчи, который помещаются в int. AreAllFibs проверяет все числа массива на принадлежность множеству чисел Фибоначчи:
using System;
using System.Collections.Generic;
HashSet<int> MakeFibs() {
HashSet<int> fibs = new HashSet<int>();
int a = 0;
int b = 1;
fibs.Add(a);
fibs.Add(b);
// a + b <= Int32.MaxValue
while (a <= Int32.MaxValue - b) {
(a, b) = (b, a + b);
fibs.Add(b);
}
return fibs;
}
HashSet<int> fibs = MakeFibs();
bool AreAllFibs(int[] numbers) {
foreach (int n in numbers) {
if (!fibs.Contains(n)) {
return false;
}
}
return true;
}
Console.WriteLine(AreAllFibs(new int[] {0, 1, 2, 3, 5, 8, 13, 1836311903}));
Console.WriteLine(AreAllFibs(new int[] {0, 1, 2, 3, 5, 8, 13, 33, 1836311903}));
$ csc -nologo fibs.cs && mono fibs.exe True False