hiho1234--Fractal(高精度比較問題)

時間限制:1000ms
單點時限:1000ms
內存限制:256MB

描述


This is the logo of PKUACM 2016. More specifically, the logo is generated as follows:

1. Put four points A0(0,0), B0(0,1), C0(1,1), D0(1,0) on a cartesian coordinate system.

2. Link A0B0, B0C0, C0D0, D0A0 separately, forming square A0B0C0D0.

3. Assume we have already generated square AiBiCiDi, then square Ai+1Bi+1Ci+1Di+1 is generated by linking the midpoints of AiBi, BiCi, CiDi and DiAi successively.

4. Repeat step three 1000 times.

Now the designer decides to add a vertical line x=k to this logo( 0<= k < 0.5, and for k, there will be at most 8 digits after the decimal point). He wants to know the number of common points between the new line and the original logo.

輸入

In the first line there’s an integer T( T < 10,000), indicating the number of test cases.

Then T lines follow, each describing a test case. Each line contains an float number k, meaning that you should calculate the number of common points between line x = k and the logo.

輸出

For each test case, print a line containing one integer indicating the answer. If there are infinity common points, print -1.

樣例輸入
3
0.375
0.001
0.478
樣例輸出
-1
4
20

題目大意:給一個正方形,然後取各邊的中點,連接成一個新的正方形,每次在新的正方形中重複此過程,共1000次。最後給出一條平行與y軸的線,問經過多少條邊。


一道水題,怎麼做在這裏就不說了,寫題解主要是想說明一下一個不少人容易犯的問題,就是兩個double型的變量d1,d2要判斷兩者是否相等,d1==d2的做法是錯誤的,正確做法應該是|d1-d2|<x,x是多少根據題意定義,在本題,d1和d2最多取到小數點後8位,那麼正確做法就是:

|d1-d2|<0.0000000001(擔心精度不夠的話可以多加一兩個0)。


AC代碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;

int cal(double k, double now, int num){
	if(k<now) return num;
	now+=(0.5-now)/2.0;
	return cal(k,now,num+2);
}

int judge(double k){
	double now=0.0;
	for(int i=1;i<=1001;i++){
		if(fabs(k-now)<0.0000000001) return 1;
		if(k<now) return 0;
		now+=((0.5-now)/2.0);
	}
	return 0;
}
 
int main()
{
//	freopen("1.txt","r",stdin);
	int T;
	double k;
	cin>>T;
	while(T--){
		scanf("%lf",&k);
		if(judge(k)) printf("-1\n");
		else printf("%d\n",2*cal(k,0,0));
	}
	return 0;
}





發佈了30 篇原創文章 · 獲贊 21 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章