现在只能实现实部和虚部都存在的情况,答案的格式也暂时没有升级。

有了加法可以相应的拓展减法,比较相等;

大体分了几个思路,先判断有没有“i”,如果没有就啥也别说了,肯定只有实部;

如果有,再看几种情况,这几种情况已经写注释了。

感觉分的有点过多了,以后有空再优化吧,得准备别的了

!!!!!!!升级了,额可能还是挺长的,我这用的StringBuffer可以进行字符的增加和删除,因为String类不能这么干;

我写的这个只能实现输入 a+bi,  a , bi,判定出来这是复数三种方式,没有写bi+a的了,如果要实现bi+a还得写好多可能,我也没试;也可以实现只输出  1+i , i ,1-i这种了;

代码比较麻烦,感觉自己太菜了不知道怎么优化了(后来去整那个正则表达式的做法了(*^▽^*))


import java.util.Scanner;
public class Complex {
	public int Real,Vir;
	public static void main(String[] args) {
		String com;
		Scanner in = new Scanner(System.in);
		System.out.println("输入第一个复数");
		com = in.next();
		Complex first = new Complex(com);
		first.say_Itself();
		System.out.println("输入第二个复数");
		com = in.next();
		Complex second = new Complex(com);
		second.say_Itself();
		first.add(second);
		first.diff(second);
		first.lenth(second);
		System.out.println(first.equals(second));
	}
	public Complex(){//初始化这个,在这可以不用写了,因为都得输入字符串
		this.Real = 0;
		this.Vir = 0;
	}
	public Complex(String s)//有点小乱
	{	
		int flag=0;
		int live_i=0;
		char temp[] = s.toCharArray();
		StringBuffer Real = new StringBuffer();
		StringBuffer Vir = new StringBuffer();
		char op1='+',op2='+';
		if(s.indexOf('i')!=-1){//有虚部
			if(s.indexOf('+')!=-1||s.lastIndexOf('-')>0)//有“+”号必有两部,有减号且最后一个减号不是第一个位置也说明都有
			{
				if(temp[0]=='-'){//记录第一个数的符号	
					op1='-';
					flag=1;
				}
				int i=flag;
				for(;i<temp.length;i++){//记录实部
					if(temp[i]=='-'||temp[i]=='+'){	
						op2 = temp[i];//第二个符号
						break;
					}	
					Real.append(temp[i]);
				}
				int real = Integer.valueOf(Real.toString());
				for( i=i+1;i<temp.length;i++){//记录虚部
					if(temp[i]!='i')
					{	
						Vir.append(temp[i]);
					}
					else
					{	live_i=1;
						break;
					}
				}
				if(live_i==1&&Vir.length()==0){//如果虚部就是个i那么就赋值1
					Vir.append("1");
				}
				int vir = Integer.valueOf(Vir.toString());
				if(op1=='-'){
					real=-real;
				}
				if(op2=='-'){
					vir=-vir;
				}
				this.Real=real;
				this.Vir=vir;
			}else{//如果不符合就说明只有虚部
				this.Real=0;
				for(int i=0;i<temp.length-1;++i){
					if(temp[i]!='-')
					{
						Vir.append(temp[i]);
					}
				}
				if(Vir.length()==0){//如果只有个i直接赋值结束
					this.Vir=1;
					if(temp[0]=='-')
					{
						this.Vir=-this.Vir;
					}
				}else {//如果不是只有个i那么就给
					this.Vir=Integer.valueOf(Vir.toString());
					if(temp[0]=='-')
					{
						this.Vir=-this.Vir;
					}
				}
			}	
		}
		else {//没有虚部就是整数直接拿s赋值就行
			this.Real=Integer.valueOf(s.toString());
			this.Vir = 0;
		}
	}
	public void say_Itself()//把参数给别的方法去输出
	{
		System.out.print("你输入的复数是:");
		sayResult(this.Real,this.Vir);
	}
	public void add(Complex other)//加法
	{
		int sum_Real,sum_Vir;
		sum_Real=this.Real+other.Real;
		sum_Vir=this.Vir+other.Vir;
		System.out.print("和:");
		sayResult(sum_Real,sum_Vir);
	}
	public void diff(Complex other)//减法
	{
		int diff_Real,diff_Vir;
		diff_Real=this.Real-other.Real;
		diff_Vir=this.Vir-other.Vir;
		System.out.print("差:");
		sayResult(diff_Real,diff_Vir);
	}
	public void sayResult(int Real_,int Vir_)//输出所有想输出的,已经把格式转换了
	{
		StringBuffer put = new StringBuffer();
		String str=String.valueOf(Real_);
		if(Real_!=0)//实部存在
		{
			put.append(str);
			if(Vir_!=0)//等于0就不管
			{
				if(Vir_>0)
				{
					if(Vir_==1)//虚部为1
					{
						put.append("+i");
					}else {
						put.append("+"+Vir_+"i");
					}
				} else if(Vir_<0)
				{
					if(Vir_==-1)//虚部为-1
					{
						put.append("-i");
					}else {
						put.append(Vir_+"i");
					}
				}
			}
		}else//不存在实部
		{
			if(Vir_!=0)//只有虚部
			{
				if(Vir_==-1)
				{
					put.append("-i");
				}else if(Vir_==1)
				{
					put.append("i");
				}else
				{
					put.append(Vir_+"i");
				}
			}else//虚部都没有
			{
				put.append("0");
			}
		}
		System.out.println(put);
	}
	public void lenth(Complex other)//计算模长,sqrt这个算的不是特别准
	{
		int x_len,y_len;
		x_len=this.Real-other.Real;
		y_len=this.Vir-other.Vir;
		System.out.println("长度是"+String.format("%.2f", Math.sqrt(x_len*x_len+y_len*y_len)));
	}
	public boolean equals(Complex other)
	{
		return this.Real==other.Real&&this.Vir==other.Vir;
	}

}