题目描述
由实部和虚部组成,形如(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>
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;
}