求复数的平均值

该博客讨论了通信系统中使用32bit数表示复数的方法,并详细介绍了复数的加、减、乘、除运算规则。接着,提出了一个计算复数平均值的问题,要求输入偶数个复数并计算它们的平均值。样例输入和输出展示了具体的计算过程,该问题适用于成都研究所的入职前练习,难度级别为2级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

由实部和虚部组成,形如(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

提示

地区

成都研究所

产品线

公共

阶段

入职前练习

难度

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值