2013华为编程大赛成都第三组 求复数的平均值

来源:互联网 发布:淘宝卖话费怎么弄 编辑:程序博客网 时间:2024/05/04 18:04
题目 B: 求复数的平均值  
时间限制: 10 Sec  内存限制: 128 MB  提交: 59  解决: 13 
[提交][状态][讨论版]  
题目描述  由实部和虚部组成,形如(a,bi)这样的数,称为复数。
通信系统中,通常用32bit数来表示复数(高16bit表示实部,低16bit表示虚部),如整数524295(16进制为0x00080007)
所代表的复数,实部为0x0008,虚部为0x0007。  有别于实数运算,复数加、减、乘、除运算定义如下: 
复数加公式:(a,bi) + (c,di) = (a + c),(b + d)i 复数减公式:(a,bi) + (c,di) = (a - c),(b - d)i  
复数乘公式:(a,bi) * (c,di) = (ac - bd),(ad + bc)i 复数除公式:(a,bi) / N = (a/N),(b/N)i  
题目要求,输入N个复数,计算这个N个复数的平均值,
复数Avg = (复数1*复数2 + 复数3*复数4 + … + 复数N-1*复数N) / N。 
 复数加、复数减、复数乘、复数除的结果仍然为复数,实部和虚部均为16bit有符号数,
计算过程中,当结果大于32767(0x7fff)时,输出32767;当计算结果小于-32768(0x8000)时,输出-32768。 
 输入  输入共计两行   有别于实数运算,复数加减乘除运算定义如下第一行包含1个整数,表示输入复数个数N(N为偶数,N不大于1000)   第一行包含1个整数,
表示输入复数个数N(N为偶数,N不大于1000)  输出  经计算得到的复数的平均值。  
样例输入  4  262149,393223,524297,655371 

样例输出  -458693


面向对象:

#include <iostream>#include <cstdlib>#include <bitset>#include <algorithm>#include <vector> const int maxn=32767;const int minn=-32768;using namespace std;class Comp{private:int real;int ima;public:Comp(int r,int i){real=r;ima=i;}Comp(){real=0;ima=0;}void set_real(int r){if(r>maxn) r=maxn;else if(r<minn) r=minn;real=r;}void set_ima(int m){if(m>maxn) m=maxn;else if(m<minn) m=minn;ima=m;}int get_real(){return real;}int get_ima(){return ima;}long long get_value(){long long k;k=real<<16;k+=ima;return k;}};int main(){int N;vector<Comp> buf;cin>>N;for(int i=1;i<=N;i++){long long tmp;cin>>tmp;int r,im;im=tmp & 65535;r=tmp>>16;Comp aa(r,im);buf.push_back(aa); }Comp sum;for(int i=0;i<buf.size()-1;i+=2){Comp tmp1=buf[i];Comp tmp2=buf[i+1];long long r,im;r=tmp1.get_real()*tmp2.get_real()-tmp1.get_ima()*tmp2.get_ima();im=tmp1.get_real()*tmp2.get_ima()+tmp1.get_ima()*tmp2.get_real();sum.set_real(sum.get_real()+r);sum.set_ima(sum.get_ima()+im);}sum.set_real(sum.get_real()/N);sum.set_ima(sum.get_ima()/N);cout<<sum.get_value()<<endl;}


原创粉丝点击