1051. 复数乘法 (15)
生活随笔
收集整理的這篇文章主要介紹了
1051. 复数乘法 (15)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
復(fù)數(shù)可以寫成(A + Bi)的常規(guī)形式,其中A是實(shí)部,B是虛部,i是虛數(shù)單位,滿足i2 = -1;也可以寫成極坐標(biāo)下的指數(shù)形式(R*e(Pi)),其中R是復(fù)數(shù)模,P是輻角,i是虛數(shù)單位,其等價(jià)于三角形式(R(cos(P) + isin(P))。
現(xiàn)給定兩個(gè)復(fù)數(shù)的R和P,要求輸出兩數(shù)乘積的常規(guī)形式。
輸入格式:
輸入在一行中依次給出兩個(gè)復(fù)數(shù)的R1, P1, R2, P2,數(shù)字間以空格分隔。
輸出格式:
在一行中按照“A+Bi”的格式輸出兩數(shù)乘積的常規(guī)形式,實(shí)部和虛部均保留2位小數(shù)。注意:如果B是負(fù)數(shù),則應(yīng)該寫成“A-|B|i”的形式。
輸入樣例:
2.3 3.5 5.2 0.4
輸出樣例:
-8.68-8.23i
錯(cuò)誤代碼:
/*************************************************************************> File Name: 1051.c> Author: YueBo > Function:復(fù)數(shù)乘法> Created Time: 2016年11月23日 星期三 22時(shí)16分44秒************************************************************************/#include <stdio.h> #include <math.h>float myRound(float x) {float val = 0.0;if (x >= 0) {val = x * 1000 + 5;} else {val = x * 1000 - 5;}val = (int)(val / 10);val = val / 100.0;return val; }int main() {float R1, P1, R2, P2, R3, P3;float temp1 = 0.0, temp2 = 0.0;scanf("%f%f%f%f", &R1, &P1, &R2, &P2);R3 = R1 * R2;P3 = P1 + P2;temp1 = myRound(R3*sin(P3));temp2 = myRound(R3*cos(P3));if (temp1 >= 0) {printf("%.2f+%.2fi", temp2, temp1);} else {printf("%.2f%.2fi", temp2, temp1);}return 0; }錯(cuò)誤提示:
錯(cuò)誤原因:
總有一個(gè)測試數(shù)據(jù)過不去,感覺怪異的不得了,怎么檢查都查不出錯(cuò)誤,后來查看別人的代碼發(fā)現(xiàn)是自己數(shù)據(jù)類型用錯(cuò)啦,由于float的精度在中間結(jié)果中可能會出錯(cuò),譬如說0.000000003 × 10000000 == 0,這樣的錯(cuò)誤,因?yàn)閒loat是8位有效數(shù)字,double是16位有效數(shù)字,很明顯把上面所有的float改成double就OK啦?,由此發(fā)現(xiàn),對于科學(xué)計(jì)算,一定要用double及精度在之之上的數(shù)據(jù)類型。
正確代碼
#include <stdio.h> #include <math.h>double myRound(double x) {double val = 0.0;if (x >= 0) {val = x * 1000 + 5;} else {val = x * 1000 - 5;}val = (int)(val / 10);val = val / 100.0;return val; }int main() {double R1, P1, R2, P2, R3, P3;double temp1 = 0.0, temp2 = 0.0;scanf("%lf%lf%lf%lf", &R1, &P1, &R2, &P2);R3 = R1 * R2;P3 = P1 + P2;temp1 = myRound(R3*sin(P3));temp2 = myRound(R3*cos(P3));if (temp1 >= 0) {printf("%.2f+%.2fi", temp2, temp1);} else {printf("%.2f%.2fi", temp2, temp1);}return 0; }之所以自己寫一個(gè)四舍五入的函數(shù)而不用printf自動進(jìn)行四舍五入是因?yàn)?#xff0c;printf("%.2f", -0.0002);結(jié)果為-0.00,其實(shí)這樣做還是麻煩啦,稍微對printf函數(shù)進(jìn)行限制一下就OK啦,
代碼如下:
/*************************************************************************> File Name: 1051.c> Author: YueBo > Function:復(fù)數(shù)乘法> Created Time: 2016年11月23日 星期三 22時(shí)16分44秒************************************************************************/#include <stdio.h> #include <math.h>int main() {double R1, P1, R2, P2, Re, Im;scanf("%lf%lf%lf%lf", &R1, &P1, &R2, &P2);Re = R1 * R2 * cos(P1+P2);Im = R1 * R2 * sin(P1+P2);if (-0.005<Re && Re<0) {printf("0.00");} else {printf("%.2f", Re);}if (-0.005<Im && Im<0) {printf("+0.00i");} else if (Im >= 0) {printf("+%.2fi", Im);} else {printf("%.2fi", Im);}return 0; }總結(jié)
以上是生活随笔為你收集整理的1051. 复数乘法 (15)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件需求说明书模板
- 下一篇: GO语言实战之函数与方法