2013华为编程大赛初赛出试题

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


import java.math.BigInteger;
import java.util.Stack;


public class SecondApp {


/**
* @param args
*/
public static void main(String[] args) {
String str="262149,393223,524297,655371";
   int result=getresult(4,str);

      System.out.println(result);
}
    public static int getresult(int num,String str){
    int result=0;
    int realsum=0;
    int imagsum=0;
    Stack<String> hexnum=new Stack<String>();
    String[] array=str.split(",");
    for(int i=0;i<num;i++){
    int temp=Integer.parseInt(array[i]);
    String hex=Integer.toHexString(temp);
    while(hex.length()<8){
    hex="0"+hex;
    }
    hexnum.push(hex);
    }
    while(!hexnum.empty()){
    String hex1=hexnum.pop();
    String hex1real1=hex1.substring(0, 4);
    String hex1imag1=hex1.substring(4);
    BigInteger bi1=new BigInteger(hex1real1,16);
    int real1=bi1.intValue();
    BigInteger bi2=new BigInteger(hex1imag1,16);
    int imag1=bi2.intValue();
    String hex2=hexnum.pop();
    String hex1real2=hex2.substring(0, 4);
    String hex1imag2=hex2.substring(4);
    BigInteger bi3=new BigInteger(hex1real2,16);
    int real2=bi3.intValue();
    BigInteger bi4=new BigInteger(hex1imag2,16);
    int imag2=bi4.intValue();
    int temp1=real2*real1;
    int temp2=imag2*imag1;
    int temp3=real2*imag1;
    int temp4=imag2*real1;
   
    if(temp1>32767){
    temp1=32767;
    }
    if(temp1<-32768){
    temp1=-32768;
    }
   
    if(temp2>32767){
    temp2=32767;
    }
    if(temp2<-32768){
    temp2=-32768;
    }
   
    if(temp3>32767){
    temp3=32767;
    }
    if(temp3<-32768){
    temp3=-32768;
    }
   
    if(temp4>32767){
    temp4=32767;
    }
    if(temp4<-32768){
    temp4=-32768;
    }
   
    realsum+=(temp1-temp2);
    imagsum+=(temp3+temp4);
    }
   
    int realavg=realsum/num;
    int imagavg=imagsum/num;
   
    String realhexavg=Integer.toHexString(realavg);
    while(realhexavg.length()<4){
    realhexavg="0"+realhexavg;
    }
    String imaghexavg=Integer.toHexString(imagavg);
    while(imaghexavg.length()<4){
    imaghexavg="0"+imaghexavg;
    }
    String hexavg=realhexavg+imaghexavg;
    BigInteger bi=new BigInteger(hexavg,16);
    result=bi.intValue();
    return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值