思路:先离线求得卡片数对应长度的数组,然后使用二分查找,注意c语言的abs()函数返回的是整数类型,要返回浮点数可以使用fabs函数
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const double delta= 1e-8;
int binary_search(float input, float cards[], int maxNum)
{
int left = 0, right = maxNum;
while(left < right){
int median = (left + right) / 2;
if(fabs(cards[median] - input) < delta){
return median;
}
else if(cards[median] > input)
right = median;
else
left = median+1;
}
//printf("right %d\t",right);
return right;
}
int main()
{
const int maxNum = 400;
float cards[maxNum];
cards[0] = 1/ 2.0; //这里的0为一张卡片的长度
for(int i = 1; i < maxNum; i++)
{
cards[i] = cards[i-1] + 1.0/(2.0 + i); //每次应该加上1/(n+2),如i=1时为2张卡片,应该加上1.0/3.0
}
//printf("%f\n",cards[56]);
float input;
scanf("%f", &input);
while(fabs(input - 0.0) > delta)
{
int pos = binary_search(input, cards, maxNum);
printf("%d card(s)\n", pos+1);
scanf("%f",&input);
}
return 0;
}