Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

怎么会是WA呢?帮忙看下啦,是不是精度不够的问题啊?

Posted by yzx at 2007-05-01 15:31:48 on Problem 3223
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

struct point
{
	double x;
	double y;
};

struct ipoint
{
	int x;
	int y;
};

struct ipoint p1,p2,p3,p4;

void getP(struct point *p)
{
	//计算交点的坐标
	double d1,d2,d3,d4;
	d1 = p1.x * ((double)p2.y - p1.y) / (p2.x - p1.x);
	d2 = p3.x * ((double)p4.y - p3.y) / (p4.x - p3.x);
	d3 = ((double)p2.y - p1.y) / (p2.x - p1.x);
	d4 = ((double)p4.y - p3.y) / (p4.x - p3.x);
	p->x = (p3.y - p1.y + d1 - d2) / (d3 - d4);
	p->y = (p2.y - p1.y) * (p->x - p1.x) / (p2.x - p1.x) + p1.y;
}

void getUVE(struct point *p)
{
	//计算切点的坐标
	double len = sqrt(((double)p3.x - p4.x) * (p3.x - p4.x) + (p3.y - p4.y) * (p3.y - p4.y));
	p->x = (p4.x - p3.x) / len;
	p->y = (p4.y - p3.y) / len;
}

double getLen(struct point p)
{
	return sqrt(sqrt((((double)p.x - p1.x) * (p.x - p1.x) + (p.y - p1.y) * (p.y - p1.y)) * ((p.x - p2.x) * (p.x - p2.x) + (p.y - p2.y) * (p.y - p2.y))));
}

double getL(struct point sp1,struct ipoint sp2)
{
	//切割线定理p^2=a*b
	return sqrt((sp1.x - sp2.x) * (sp1.x - sp2.x) + (sp1.y - sp2.y) * (sp1.y - sp2.y));
}

double getL(struct ipoint sp1,struct ipoint sp2)
{
	//算两点间距离
	return sqrt(((double)sp1.x - sp2.x) * (sp1.x - sp2.x) + (sp1.y - sp2.y) * (sp1.y - sp2.y));
}

int isnumber(char c)
{
	if(c>='0' && c<='9')
		return 1;
	else
		return 0;
}

int getin()
{
	char buffer[100];
	char nbuffer[10];
	if(gets(buffer) == NULL)
	{
		return EOF;
	}
	int i;
	int j;

	int len = strlen(buffer);

	j = 0;
	i = -1;

	while(isnumber(buffer[++i])==0);
	for(;i < len;i++)
	{
		if(isnumber(buffer[i])==0)
			break;
		nbuffer[j++] = buffer[i];
	}
	nbuffer[j] = 0;
	p1.x = atoi(nbuffer);


	j = 0;
	while(isnumber(buffer[++i])==0);
	for(;i < len;i++)
	{
		if(isnumber(buffer[i])==0)
			break;
		nbuffer[j++] = buffer[i];
	}
	nbuffer[j] = 0;
	p1.y = atoi(nbuffer);

	j = 0;
	while(isnumber(buffer[++i])==0);
	for(;i < len;i++)
	{
		if(isnumber(buffer[i])==0)
			break;
		nbuffer[j++] = buffer[i];
	}
	nbuffer[j] = 0;
	p2.x = atoi(nbuffer);

	j = 0;
	while(isnumber(buffer[++i])==0);
	for(;i < len;i++)
	{
		if(isnumber(buffer[i])==0)
			break;
		nbuffer[j++] = buffer[i];
	}
	nbuffer[j] = 0;
	p2.y = atoi(nbuffer);

	j = 0;
	while(isnumber(buffer[++i])==0);
	for(;i < len;i++)
	{
		if(isnumber(buffer[i])==0)
			break;
		nbuffer[j++] = buffer[i];
	}
	nbuffer[j] = 0;
	p3.x = atoi(nbuffer);

	j = 0;
	while(isnumber(buffer[++i])==0);
	for(;i < len;i++)
	{
		if(isnumber(buffer[i])==0)
			break;
		nbuffer[j++] = buffer[i];
	}
	nbuffer[j] = 0;
	p3.y = atoi(nbuffer);

	j = 0;
	while(isnumber(buffer[++i])==0);
	for(;i < len;i++)
	{
		if(isnumber(buffer[i])==0)
			break;
		nbuffer[j++] = buffer[i];
	}
	nbuffer[j] = 0;
	p4.x = atoi(nbuffer);

	j = 0;
	while(isnumber(buffer[++i])==0);
	for(;i < len;i++)
	{
		if(isnumber(buffer[i])==0)
			break;
		nbuffer[j++] = buffer[i];
	}
	nbuffer[j] = 0;
	p4.y = atoi(nbuffer);
	if(i >= len)
		return EOF;
	else
		return 1;
}

int main()
{

	freopen("3223.in","r",stdin);

	while(getin() != EOF)
	{

		struct point p;
		struct point e;
		struct point g;
		double len;
		double a,b,c;
		double Cos;
		//得到交点
		getP(&p);
		//得到交点到切点的距离
		len = getLen(p);
		//得到单位向量
		getUVE(&e);
		//计算切点坐标
		g.x = p.x + len * e.x;
		g.y = p.y + len * e.y;
		
		//利用余弦定理计算余弦值
		a = getL(g,p2);
		b = getL(g,p1);
		c = getL(p1,p2);
		Cos = (a * a + b * b - c * c) / (2 * a * b);
		//反余弦后进行弧度单位转化
		Cos = acos(Cos) * 180 / 3.1415926535897932384626433832795;
		//输出结果
		printf("%.3f\n", Cos);		
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator