书上原题目为:
数组A含有9个元素,这些元素恰好是第2至第10个Fibonacci数,写出在数组A中查找x=17的二分查找过程。
Fibonacci数列的递推公式为:
前10个Fibonacci数为:
1 1 2 3 5 8 13 21 34 55
因此数组A为:
1 2 3 5 8 13 21 34 55
从数组中可以看到,x=17并不在数组中。而且我觉得让用户输入需要查询的数字会更灵活。因此写了如下程序:
// Chapter7_4.cpp : Defines the entry point for the application.
// 数组A含有9个元素,这些元素恰好是第2至第10个Fibonacci数,
// 写出在数组A中查找x=?的二分查找过程。
#include "stdafx.h"
#include<iostream>
using namespace std;
const int N = 10;
//查找函数
//已经从小到大排好序的前提下
//参数分别为:需要查找的数组,查找初始位置,查找结束位置,查找的数字
int funSearch(int arr[],int Begin,int End,int x)
{
//二分到只剩一个数字
if(Begin == End)
{
//当查找的数字在数组中时
if(arr[Begin] == x)
return Begin+1;
else
{
cout << x << " is not in the array!" << endl;
return -1;
}
}
else
{
//如果查找的数字在后半部分
if(arr[(Begin+End)/2] < x)
Begin = (Begin+End)/2+1;
//如果查找的数字在后半部分
else
End = (Begin+End)/2;
return funSearch(arr,Begin,End,x);
}
}
int main()
{
int arr[N],i,position;
int x;
//求Fibonacci数列
arr[0] = 1;
arr[1] = 1;
for(i=2;i<N;i++)
arr[i] = arr[i-1]+arr[i-2];
//输出Fibonacci数组中前10个元素
cout << "前" << N << "个Fibonacci数为:" << endl;
for(i=0;i<N;i++)
cout << arr[i] << ' ';
cout << endl;
//输出数组A中的元素
cout << "数组A中的元素为:" << endl;
for(i=1;i<N;i++)
cout << arr[i] << ' ';
cout << endl;
//用户输入想查找的数字
cout << "input the number you want to search: ";
cin >> x;
//调用函数求位置
position = funSearch(arr,0,N-1,x) - 1; //减1是因为用Fibonacci数组进行计算的,A数组相应的要减1
cout << x << " is in the " << position << "th number." << endl;
system("pause");
return 0;
}
运行结果如下:
虽然17不在数组中,但还是输出了 17 is in the -2th number. 。这是因为没有查找到时会返回-1,因此,输出角标为负可以不用管。