⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1046.txt

📁 平时acm训练时ac的源代码
💻 TXT
字号:
这个解法用到了类的方面,我感觉竞赛中用到的关于类的知识不多,因为类的功能可以用函数代替,而且类的知识其实是很复杂的,学多了对竞赛没帮助(仅对竞赛来说),学少了用的时候容易出错,建议还是看懂这题的思想后自己用面向过程去实现。

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;//名字空间(前面库文件不用加“.h” ,后面标准函数不用加“std”在前面)

const double pi = 3.141592654;//定义常量

class complex {//定义类的名字
public:        //这是公共类型(假如用此类型定义了一个对象以后,对象可以直接调用此变量,如:complex a;a.r可以使用。与公共类型相对应的有保护类型(protect)和私有类型(private),私有类型必须通过类的函数才能调用,这种类型比较安全。保护类型在继承中用得较多。如果你对类的知识想了解更多,最好自己找找C++的书看
double r;
double i;
complex(double rnew = 0.0,double inew = 0.0) {//这是一个默认构造函数,当用complex定义了一个对象之后,该对象就被这个函数进行初始化构造,如上面所说a,此时a.rnew=0.0,a.inew=0.0
r=rnew;
i=inew;
}
~complex() {}//这是一个默认析构函数,它与前面默认构造函数相对应,用来对一些推出程序后需要清理的对象进行析构,或者对推出某一函数后某一对象原来的副本进行析构(说得通俗些,析构就是清理),析构函数用到的地方还有很多。
complex &operator = (const complex &c) {//以下四个函数其实分别对=,+,-,*,/,进行重新定义,使对象也能用这些符号进行运算
r=c.r;
i=c.i;
return *this;//这个是this指针,用来指向调用这个函数的对象
}
complex operator + (const complex &c) const {
return (complex(r+c.r,i+c.i));
}
complex operator - (const complex &c) const {
return (complex(r-c.r,i-c.i));
}
complex operator * (const complex &c) const {
return (complex(r*c.r-i*c.i,i*c.r+r*c.i));
}
complex operator / (const complex &c) const {
return (complex((r*c.r+i*c.i)/(c.r*c.r+c.i*c.i),
(i*c.r-r*c.i)/(c.r*c.r+c.i*c.i)));
}
};

int main(void)
{
long n,i,j;
cin>>n;
complex temp,a,b;
complex* z=new complex[n+1];//给对象z(指针类型)赋予n+1个新地址,z指向首地址,以后我们可以这样用z[0],z[1],……,z[n](这时,z又可以看成一个数组)
complex* node=new complex[n+1];
complex* result=new complex[n+1];
double* degree=new double[n+1];
for(i=1;i<=n;i++)
{
	cin>>z[i].r>>z[i].i;
}
for(i=1;i<=n;i++)
{
	cin>>degree[i];
	degree[i]=degree[i]*pi/180;
	node[i].r=cos(degree[i]);
	node[i].i=sin(degree[i]);
}
for(i=1;i<=n;i++)
{
	temp=z[i]*(node[i]-complex(1,0));
	for(j=i+1;j<=n;j++)
	{
		temp=temp*node[j];
	}
	a=a+temp;
}
b=node[1];
for(i=2;i<=n;i++)
{
	b=b*node[i];
}
b=b-complex(1,0);
result[1]=a/b;
for(i=2;i<=n;i++)
{
	result[i]=(result[i-1]-z[i-1])*node[i-1]+z[i-1];
}
for(i=1;i<=n;i++)
{
	cout<<result[i].r<<" "<<result[i].i<<endl;

}
delete []z;//这是将用new建立起的对象销毁的函数,delete []销毁的是数组
delete []node;
delete []result;
delete []degree;
return 0;
}

至于这题的算法,用到的都是解析几何的知识,我把大概的思路讲一下吧。
就题目所给数据来说,我们知道m1,m2,m3都为90度,我们假设已知点(0,2),(3,3),(2,0)
分别为z0,z1,z2,我们假设要求的其中一点为x0,那么x1与x0的关系式在附件a.doc里
把那三个式子合并成一项,就能求出x0,求出一个点后剩下的就好说了。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -