现在只能实现实部和虚部都存在的情况,答案的格式也暂时没有升级。
有了加法可以相应的拓展减法,比较相等;
大体分了几个思路,先判断有没有“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;
}
}