题目:复数平均值
由实部和虚部组成,形如(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)
第二行包含N个整数,分别表示输入复数
输出
经计算得到的复数的平均值。
样例输入
4 262149,393223,524297,655371
样例输出
-458693
代码:
#include"stdio.h"
int main()
{
int n;
int i,num,Avg;
int rsum=0,xsum=0;
int a[1001],b[1001];
scanf("%d",&n);
if((n%2==1)||(n>1000)||(n<1))
{
return 0;
}
for(i=0;i<n;i++)
{
if(i!=n-1)
{
scanf("%d,",&num);
}
else
{
scanf("%d",&num);
}
a[i]=(num>>16);
b[i]=num&0xffff;
if(i%2==1)
{
rsum+=(a[i-1]*a[i]-b[i-1]*b[i]);
xsum+=(a[i-1]*b[i]+b[i-1]*a[i]);
}
}
if(rsum>32767) rsum=32767;
if(rsum<-32768) rsum=-32768;
if(xsum>32767) xsum=32767;
if(xsum<-32768) xsum=-32768;
rsum=rsum/n;
xsum=xsum/n;
Avg=(rsum<<16)+xsum;
printf("%d\n",Avg);
return 0;
}