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

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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值