using System;
namespace ConsoleApp1
{
//斐波那契数
//请查找集合中第一个大于2147483647的数
class Program
{
//递归写法
public static ulong Foo(int n)
{
if (n < 2)
{
return 1;
}
else
{
return Foo(n - 2) + Foo(n - 1);
}
}
//循环写法
//ulong 0 到 18,446,744,073,709,551,615
public static ulong Foo2(int n)
{
ulong a = 1;
ulong b = 1;
if (n == 1 || n == 2)
{
return 1;
}
else
{
for (int i = 3; i <= n; i++)
{
ulong c = a + b; //两数之和
// Console.WriteLine("b={0}", a);
b = a; //之前的和放在b中
// Console.WriteLine("c={0}", c);
a = c; //当前的和放到a中
}
return a;
}
}
static void Main(string[] args)
{
// 1,1,2,3,5,8,13,21,34
Console.WriteLine("斐波那契数第30位:");
Console.WriteLine(Foo(30));
//Console.WriteLine(Foo2(30));
//请查找集合中第一个大于 2147483647 的数--使用二分查找法
int i = 1;
ulong total = 0;
while (total < 2147483647)
{
total = Foo2(i);
Console.WriteLine(total);
i++;
}
Console.WriteLine(i);
Console.ReadKey();
}
/// <summary>
/// 二分查找法
/// </summary>
/// <param name="array"></param>
/// <param name="key"></param>
/// <returns></returns>
private static int FibonacciSearch(int[] array, int key)
{
int length = array.Length;
int low = 0, high = length - 1, mid = 0;
mid = (low + high) / 2;
while (mid < high)
{
if (array[mid] == key)
{
break;
}
else if (array[mid] > key)
{
high = mid;
mid = (low + high) / 2;
}
else if (array[mid] < key)
{
low = mid;
mid = (low + high) / 2;
}
}
return mid;
}
}
}