1. 程式人生 > >藍橋杯 演算法提高 ADV-120 6-17複數四則運算

藍橋杯 演算法提高 ADV-120 6-17複數四則運算

演算法提高 6-17複數四則運算
時間限制:1.0s 記憶體限制:512.0MB
  設計複數庫,實現基本的複數加減乘除運算。
  輸入時只需分別鍵入實部和虛部,以空格分割,兩個複數之間用運算子分隔;輸出時按a+bi的格式在螢幕上列印結果。參加樣例輸入和樣例輸出。
  注意考慮特殊情況,無法計算時輸出字串"error"。
樣例輸入
2 4 * -3 2
樣例輸出
-14-8i
樣例輸入
3 -2 + -1 3
樣例輸出
2+1i

分析:複數的四則運算公式見註釋,程式碼如下:

PS:剛開始在輸出error的位置我return了-1,代表是錯誤,結果提交上去老是執行錯誤。後來猜測是藍橋判斷了main的返回值,必須為0才不會執行錯誤,改為return 0之後果然正確了。(~ ̄▽ ̄)~
特此提醒一下那些和我一樣習慣出錯就return -1的小夥伴,注意一下哈~

#include <iostream>
using namespace std;

//複數類 
struct fushu
{	//a+bi;
	double a;
	double b;
};

//複數的加法運算:(a+bi)+(c+di) = (a+c)+(b+d)i
fushu *add(fushu *y1, fushu *y2)
{
	fushu *temp = new fushu;
	temp->a = y1->a + y2->a;
	temp->b = y1->b + y2->b;
	return temp;
}

//複數的減法運算:(a+bi)-(c+di) = (a-c)+(b-d)i
fushu *jian(fushu *y1, fushu *y2)
{
	fushu *temp = new fushu;
	temp->a = y1->a - y2->a;
	temp->b = y1->b - y2->b;
	return temp;
}

//複數的乘法運算:(a+bi)*(c+di) = (ac-bd) + (ad-bc)i
fushu *cheng(fushu *y1, fushu *y2)
{
	fushu *temp = new fushu;
	temp->a = y1->a * y2->a - y1->b * y2->b;
	temp->b = y1->a * y2->b + y1->b * y2->a;
	return temp;
}

//複數的除法運算:(a+bi)/(c+di) = (ac+bd)/(c*c+d*d)+(bc-ad)/(c*c+d*d)i
fushu *chu(fushu *y1, fushu *y2)
{
	fushu *temp = new fushu;
	//注意分母不能為0
	if(y2->a == 0 && y2->b == 0)
	{
		return NULL;
	}
	temp->a = (y1->a * y2->a + y1->b * y2->b)/(y2->a * y2->a + y2->b * y2->b);
	temp->b = (y1->b * y2->a - y1->a * y2->b)/(y2->a * y2->a + y2->b * y2->b);
	return temp;
}

int main()
{
	fushu *y1 = new fushu;
	fushu *y2 = new fushu;
	fushu *result; 
	char ch;
	
	cin >> y1->a >> y1->b >> ch >> y2->a >> y2->b;
	
	switch(ch)
	{
		case '+': result = add(y1, y2); break;
		case '-': result = jian(y1, y2); break;
		case '*': result = cheng(y1, y2); break;
		case '/': result = chu(y1, y2); break;
		default: result = NULL;
	}
	
	if(!result)	//如果result == NULL,則報錯
	{
		cout << "error";
		return 0;
	}
	
	cout << result->a;
	if(result->b > 0) cout << "+";	//如果是正數,則前面補‘+’號,負數自帶‘-’號
	cout << result->b << "i";
	
	return 0;
}