求助误差大
  • 板块P3945 三体问题
  • 楼主dshzsh
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/11/6 17:57
  • 上次更新2023/11/5 08:47:45
查看原帖
求助误差大
200116
dshzsh楼主2020/11/6 17:57

rt,2分.....

#include<bits/stdc++.h>
#define G 6.67408e-11
#define mit 0.01
//#define ff(x) ((x>0)?x:(-x))
using namespace std;
int n;
class poj
{
	public:
	int spe;
	double m;
	double x[3],v[3],a[3];
	poj(){}
	poj(double xt,double yt,double zt,double mt,double vxt,double vyt,double vzt,int st)
	{
		m=mt,x[0]=xt,x[1]=yt,x[2]=zt;spe=st;
		v[0]=vxt,v[1]=vyt,v[2]=vzt;
		a[0]=a[1]=a[2]=0;
	}
	void move()
	{
		for(int i=0;i<=2;i++)
		{
			x[i]+=v[i]*mit;
			a[i]+=x[i]*mit;
		}
	}
};
poj a[40];
double js(poj a,poj b)
{
	return sqrt((a.x[0]-b.x[0])*(a.x[0]-b.x[0])+(a.x[1]-b.x[1])*(a.x[1]-b.x[1])+(a.x[2]-b.x[2])*(a.x[2]-b.x[2]));
}
void gx(poj &x)
{
	for(int i=1;i<=n;i++)
	{
		if(i!=x.spe)
		{
			double jl=js(x,a[i]);
			double ff=G*a[i].m*x.m/(jl*jl);
			for(int j=0;j<=2;j++)
			{
				x.a[j]+=ff*fabs(a[i].x-x.x)/jl/x.m;
			}
		}
	}
}
int main()
{
	double t;
	scanf("%d%lf",&n,&t);
	for(int i=1;i<=n;i++)
	{
		double x,y,z,m,vx,vy,vz;
		scanf("%lf%lf%lf%lf%lf%lf%lf",&x,&y,&z,&m,&vx,&vy,&vz);
		a[i]=poj(x,y,z,m,vx,vy,vz,i);
	}
	for(int it=0;it<=t*100;it++)
	{
		for(int j=1;j<=n;j++)
			a[j].move();
		for(int j=1;j<=n;j++)
			gx(a[j]);
	}
	for(int j=1;j<=n;j++)
		printf("%f %f %f\n",a[j].x[0],a[j].x[1],a[j].x[2]);
	return 0;
}
2020/11/6 17:57
加载中...