华为编程 复数求均值

题目描述

由实部和虚部组成,形如(a,bi)这样的数,称为复数。通信系统中,通常用32bit数来表示复数(高16bit表示实部,低16bit表示虚部),如整数52429516进制为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有符号数,计算过程中,当结果大于327670x7fff)时,输出32767;当计算结果小于-327680x8000)时,输出-32768

输入

输入共计两行

有别于实数运算,复数加减乘除运算定义如下第一行包含1个整数,表示输入复数个数NN为偶数,N不大于1000

第一行包含1个整数,表示输入复数个数NN为偶数,N不大于1000

输出

经计算得到的复数的平均值。

样例输入

4
262149,393223,524297,655371

样例输出

-458693

我的代码:下面代码还有问题,留着改

#include<iostream>
using  namespace std;
int high(int a){
  return a>>16;
}
int low(int a){
  return a&0x0000ffff;
}
int get(int a){
  if(a>32767) a=32767;
  if(a<-32768) a=-32768;
  return a;
}
int add(int ll,int rr){
   int a=high(ll);
   int b=low(ll);
   int c=high(rr);
   int d=low(rr);
   
   return (get(a+b)<<16)+get(b+d);
}
int mul(int ll,int rr){
   int a=high(ll);
   int b=low(ll);
   int c=high(rr);
   int d=low(rr);
   return (get(a*c-b*d)<<16)+get(a*d+b*c);
}
int div2(int ll,int n){
  int a=high(ll);
  int b=low(ll);
  a/=n;
  b/=n;
  return (get(a)<<16)+b;
}
int main(){

  int arr[]={262149,393223,524297,655371};
  int res=0;
  for(int i=0;i<4;i+=2){
	res=add(res,mul(arr[i],arr[i+1]));
  }
  res=div2(res,4);
  cout<<res<<endl;
  
  

 return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值