题目传送门
题目注意事项:
本题万有引力常数 G 取 6.67408×10−11。
做这道题所需的知识:
1:距离公式
在三维空间内有两个点,设第一个点的坐标为 (x1,y1,z1),第二个点的坐标为 (x2,y2,z2),那两点之间的距离 distance 为:
distance=(x2−x1)2+(y2−y1)2+(z2−z1)2。
2:算加速度的
设 F 表示力的大小,M1,M2 表示两个物体的质量,r 表示两个物体之间的距离,G 是万有引力常数,有 F=G×r2M1×M2。
而且还有设 F 表示力的大小,M 表示物体的质量,a 表示加速度 F=M×a。
联立可得 M⋅a=G×r2M1×M2。
化简可得 a=G×r2M。
3:匀变速直线运动的公式
位移公式 x=v0t+21at2。
速度公式 v=at。
然后就可以开始构思代码了
先定义一个结构体来存天体。
1 2 3 4 5 6 7 8
| struct stars{ long double x,y,z; long double xv,yv,zv; long double nowx,nowy,nowz; long double changex,changey,changez; long double tmp; long double mass; }m[MAXN];
|
再解决一下改变量的计算。
1 2 3 4 5 6 7 8 9
| m[i].changex=m[j].x-m[i].x; m[i].changey=m[j].y-m[i].y; m[i].changez=m[j].z-m[i].z;
m[i].tmp=sqrt(m[i].changex*m[i].changex + m[i].changey*m[i].changey + m[i].changez*m[i].changez);
m[i].nowx += m[j].mass*G/(m[i].tmp*m[i].tmp) * m[i].changex/(m[i].tmp); m[i].nowy += m[j].mass*G/(m[i].tmp*m[i].tmp) * m[i].changey/(m[i].tmp); m[i].nowz += m[j].mass*G/(m[i].tmp*m[i].tmp) * m[i].changez/(m[i].tmp);
|
最后再解决单位时间内改变的问题。
1 2 3 4
| m[i].x+=t0*(m[i].xv+=t0*m[i].nowx); m[i].y+=t0*(m[i].yv+=t0*m[i].nowy); m[i].z+=t0*(m[i].zv+=t0*m[i].nowz);
|
再保留一个小数位数。
1
| cout<<fixed<<setprecision(12);
|
最后就是完整代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <bits/stdc++.h> #define G 6.67408e-11
using namespace std;
const long double t0=0.01; const int MAXN=30+10;
int n; long double tt;
struct stars{ long double x,y,z; long double xv,yv,zv; long double nowx,nowy,nowz; long double changex,changey,changez; long double tmp; long double mass; }m[MAXN];
int main(){ cin>>n>>tt; for(int i=1;i<=n;i++){ cin>>m[i].x>>m[i].y>>m[i].z; cin>>m[i].mass; cin>>m[i].xv>>m[i].yv>>m[i].zv; } while(tt>0){ tt-=t0; for(int i=1;i<=n;i++){ m[i].nowx=m[i].nowy=m[i].nowz=0; for(int j=1;j<=n;j++){ if(i!=j){ m[i].changex=m[j].x-m[i].x; m[i].changey=m[j].y-m[i].y; m[i].changez=m[j].z-m[i].z; m[i].tmp=sqrt(m[i].changex*m[i].changex + m[i].changey*m[i].changey + m[i].changez*m[i].changez); m[i].nowx += m[j].mass*G/(m[i].tmp*m[i].tmp) * m[i].changex/(m[i].tmp); m[i].nowy += m[j].mass*G/(m[i].tmp*m[i].tmp) * m[i].changey/(m[i].tmp); m[i].nowz += m[j].mass*G/(m[i].tmp*m[i].tmp) * m[i].changez/(m[i].tmp); } } } for(int i=1;i<=n;i++){ m[i].x+=t0*(m[i].xv+=t0*m[i].nowx); m[i].y+=t0*(m[i].yv+=t0*m[i].nowy); m[i].z+=t0*(m[i].zv+=t0*m[i].nowz); } } cout<<fixed<<setprecision(12); for(int i=1;i<=n;i++) cout<<m[i].x<<' '<<m[i].y<<' '<<m[i].z<<endl; return 0; }
|