1051. 复数乘法 (15)
来源:互联网 发布:大数据产品分析 编辑:程序博客网 时间:2024/04/29 17:45
复数可以写成(A + Bi)的常规形式,其中A是实部,B是虚部,i是虚数单位,满足i2 = -1;也可以写成极坐标下的指数形式(R*e(Pi)),其中R是复数模,P是辐角,i是虚数单位,其等价于三角形式(R(cos(P) + isin(P))。
现给定两个复数的R和P,要求输出两数乘积的常规形式。
输入格式:
输入在一行中依次给出两个复数的R1, P1, R2, P2,数字间以空格分隔。
输出格式:
在一行中按照“A+Bi”的格式输出两数乘积的常规形式,实部和虚部均保留2位小数。注意:如果B是负数,则应该写成“A-|B|i”的形式。
输入样例:
2.3 3.5 5.2 0.4
输出样例:
-8.68-8.23i
错误代码:
/*************************************************************************> File Name: 1051.c> Author: YueBo > Function:复数乘法> Created Time: 2016年11月23日 星期三 22时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;}
错误提示:
错误原因:
总有一个测试数据过不去,感觉怪异的不得了,怎么检查都查不出错误,后来查看别人的代码发现是自己数据类型用错啦,由于float的精度在中间结果中可能会出错,譬如说0.000000003 × 10000000 == 0,这样的错误,因为float是8位有效数字,double是16位有效数字,很明显把上面所有的float改成double就OK啦☺,由此发现,对于科学计算,一定要用double及精度在之之上的数据类型。
正确代码
#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;}
之所以自己写一个四舍五入的函数而不用printf自动进行四舍五入是因为,printf("%.2f", -0.0002);结果为-0.00,其实这样做还是麻烦啦,稍微对printf函数进行限制一下就OK啦,
代码如下:
/*************************************************************************> File Name: 1051.c> Author: YueBo > Function:复数乘法> Created Time: 2016年11月23日 星期三 22时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;}
0 0
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- 1051. 复数乘法 (15)
- [LeetCode]Spiral Matrix
- 得到当前电脑日期的前后两天
- SQLserver学习day04 T-SQL数据操作(增,删,改) 数据的导入导出 批处理
- 关于教育
- 原理
- 1051. 复数乘法 (15)
- [Lintcode]Maximum Subarray II 最大子数组 II
- 排序算法
- 图的邻接表存储
- Python验证码识别:利用pytesser识别简单图形验证码
- Tomcat tcnative-1.dll文件的64bit版本异常
- java单例设计模式
- no-install mysql 更改密码
- Windows核心编程 第十五章 在应用程序中使用虚拟内存