题目描述
由实部和虚部组成,形如(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
提示
无
地区
成都研究所
产品线
公共
阶段
入职前练习
难度
2级
public long getAvgValueOfComplex(){
Scanner sc=new Scanner(System.in);
int N=Integer.valueOf(sc.nextLine());
String[] input=sc.nextLine().split(",");
Stack<Character> s=new Stack<Character>();
long real=0,ima=0;
List<Long> li=new ArrayList<Long>();
for(int i=0;i<N;i++){
String hex=Long.toHexString(Long.valueOf(input[i]));//十进制转十六进制
char[] c=hex.toCharArray();
for(int j=c.length-1;j>=0;j--){
s.push(c[j]);
}
while(s.size()<8){
s.push('0');//不够8位补零
}
StringBuilder sbreal=new StringBuilder();
while(s.size()>4){
sbreal.append(s.pop());//取高四位作为实部
}
real=Long.parseLong(sbreal.toString(),16);//十六进制转十进制
li.add(real);
StringBuilder sbima=new StringBuilder();
while(s.size()>0){
sbima.append(s.pop());//取低四位作为虚部
}
ima=Long.parseLong(sbima.toString(),16);//十六进制转十进制
li.add(ima);
}
Object[] obj=li.toArray();
long sumReal=0,sumIma=0;
for(int i=0;i<2*N;i=i+4){
long rr=(Long)obj[i]*(Long)obj[i+2]-(Long)obj[i+1]*(Long)obj[i+3];
long ii=(Long)obj[i]*(Long)obj[i+3]+(Long)obj[i+1]*(Long)obj[i+2];
if(rr>32767||ii>32767){
return 32767;
}
if(rr<-32768||ii<-32768){
return -32768;
}
sumReal+=rr;
sumIma+=ii;
}
if(sumReal>32767||sumIma>32767){
return 32767;
}
if(sumReal<-32768||sumIma<-32768){
return -32768;
}
String high=Long.toHexString(sumReal/N);
String low=Long.toHexString(sumIma/N);
int len=low.length();
String complexHex=null;
switch(len){//不够四位补零
case 4:
complexHex=high+low;
break;
case 3:
complexHex=high+"0"+low;
break;
case 2:
complexHex=high+"00"+low;
break;
case 1:
complexHex=high+"000"+low;
break;
}
BigInteger bi=new BigInteger(complexHex,16);解决负数转换异常问题
Long complex=bi.longValue();
return complex;
}