http://blog.csdn.net/xiaozhuaixifu/article/details/9842683
题目 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;
}
#include<vector>
#include<iostream>
using namespace std;
const int maxn = 32767;
const int minn = -32768;
class Comp
{
private:
int real;
int imag;
public:
Comp()
{
real = 0;
imag = 0;
}
Comp(int r,int i)
{
real = r;
imag = i;
}
void set_real(int r)
{
if(r>maxn) r = maxn;
else if(r<minn) r = minn;
real = r;
}
void set_imag(int m)
{
if(m>maxn) m = maxn;
else if(m<minn) m = minn;
imag = m;
}
int get_real()
{
return real;
}
int get_imag()
{
return imag;
}
long long get_value()
{
long long k;
k = real<<16;
k+=imag;
return k;
}
};
int main()
{
int N;
vector<Comp> buf;
cin>>N;
for(int i=1;i<=N;i++)
{
long long temp;
cin>>temp;
int r,im;
im = temp&65535;//取低16位
r = temp>>16; //取高16位
Comp aa(r,im);
buf.push_back(aa);
}
Comp sum;
for(int i=0;i<N-1;i+=2)
{
long long r,im;
Comp temp1 = buf[i];
Comp temp2 = buf[i+1];
r = temp1.get_real() * temp2.get_real() - temp1.get_imag() * temp2.get_imag();
im = temp1.get_real() * temp2.get_imag() + temp1.get_imag() * temp2.get_real();
sum.set_real(sum.get_real()+r);
sum.set_imag(sum.get_imag()+im);
}
sum.set_real(sum.get_real()/N);
sum.set_imag(sum.get_imag()/N);
cout<<sum.get_value()<<endl;
}