zoukankan      html  css  js  c++  java
  • B1051 复数乘法(15 分)

    【PAT】B1051 复数乘法(15 分) - 路明天 - 博客园 https://www.cnblogs.com/hebust/p/9496809.html
    在此对四舍五入输出结果做总结。
    对于doublde 类型,int i = (int )(a+0.5),实现保留到个位的四舍五入,一般的“.2f”是四舍六入五成双的。
    另外就是针对double的0的处理,要特别注意在0附近实现四舍五入。

        if (A + 0.005 >= 0 && A < 0)
            printf("0.00");
        else
            printf("%.2f", A);
        if(B >= 0)
            printf("+%.2fi", B);
        else if (B + 0.005 >= 0 && B < 0)
            printf("+0.00i");
        else
            printf("%.2lfi", B);
    

    B1051 复数乘法 (15分)

    输入格式:
    输入在一行中依次给出两个复数的R和P,数字间以空格分隔。

    输出格式:
    在一行中按照 A+Bi的格式输出两数乘积的常规形式,实部和虚部均保留 2 位小数。注意:如果 B 是负数,则应该写成 A-|B|i 的形式。

    输入样例:
    2.3 3.5 5.2 0.4
    输出样例:
    -8.68-8.23i

    别人的AC代码

    还要注意到用四舍五入的方法判断是否应该输出0.00
    这个计算方法,比我的简单,我想要代码复用,反而造成了恶果。
    保留两位小数

    if (A + 0.005 >= 0 && A < 0)
            printf("0.00");
    

    为什么保留两位小数这么复杂,这里是若5则入,对0的符号,对0附近的数特别对待。
    保留两位小数,.2lf使用的是,四舍六入五成双的规则。
    要四舍五入,那么就用round函数,得到一个double 在强制转换int,就是整数位的四舍五入去掉小数部分,不如
    int i = (int)(a+0.5)的技巧漂亮。

    #include <math.h>
    #include<stdio.h>
    int main() {
        double r1, p1, r2, p2, A, B;
        scanf("%lf %lf %lf %lf",&r1,&p1,&r2,&p2);
        r1*=r2;p1+=p2;
        A = r1 * cos(p1);
        B = r1 * sin(p1);
        if (A + 0.005 >= 0 && A < 0)
            printf("0.00");
        else
            printf("%.2f", A);
        if(B >= 0)
            printf("+%.2fi", B);
        else if (B + 0.005 >= 0 && B < 0)
            printf("+0.00i");
        else
            printf("%.2lfi", B);
        return 0;
    }
    

    从这里的AC代码,得到的启示,或者说小知识,就是保留小数位的精度,输出,对于0附近的数要特别注意。要实现这里的四舍五入输出0.00或者0.000之类的,采用+0.005>=0 并且本身小于0,来实现四舍五入。

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    #include<cmath>
    using namespace std;
    
    
    int main()
    {
        double R1, P1, R2, P2;
        double a, b, c, d;
    
        cin >> R1 >> P1 >> R2 >> P2;
        a = R1*cos(P1);
        b = R1*sin(P1);
        c = R2*cos(P2);
        d = R2*sin(P2);
    
        double shi, xu;
        shi = a*c - b*d;
        xu = b*c + a*d;
        if (abs(shi) < 0.001)
            shi = 0;
        if (abs(xu) < 0.001)
            xu = 0;
    
        if (xu >= 0)
            printf("%.2f+%.2fi", shi, xu);
        else if (xu < 0)
            printf("%.2f%.2fi", shi, xu);
    
        system("pause");
        return 0;
    }
    

    作者:ad50468549
    来源:CSDN
    原文:https://blog.csdn.net/u011036919/article/details/66975447
    版权声明:本文为博主原创文章,转载请附上博文链接!

    	double shi, xu;
        shi = a*c - b*d;
        xu = b*c + a*d;
        if (abs(shi) < 0.001)
            shi = 0;
        if (abs(xu) < 0.001)
            xu = 0;
    
        if (xu >= 0)
            printf("%.2f+%.2fi", shi, xu);
        else if (xu < 0)
            printf("%.2f%.2fi", shi, xu);
    

    修改

    	if (abs(shi) <= 0.004)
            shi = 0;
        if (abs(xu) <= 0.04)
            xu = 0;
    

    依然能够AC掉
    改成0.1,有一个测试点过不去,所以那一个测试点,正是在考察对0的四舍五入
    如果是-0.004,那么应该输出的是-0.00吗?
    printf("%.2f", -0.004);
    输出的是-0.00
    printf("%.2f", -0.005);
    这样输出的是-0.01,还是一样的四舍五入进位了。
    但是这个进位是绝对值的进位(c++)和需要的对0处理不符合按照AC代码1,这里应输出0.00

  • 相关阅读:
    怎样做一个合格的程序猿
    error: No resource identifier found for attribute &#39;format24Hour&#39; in package &#39;android&#39;
    【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第五步)(4)
    Length of last word--LeetCode
    SmartController智能控制系统
    湘潭-1203-A simple problem
    android中检測网络连接状态简单总结
    AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的差别
    please set a system env PAODING_DIC_HOME or Config paoding.dic.home in paoding-dic-home.properties p
    与IBM的Lin Sun关于Istio 1.0和微服务的问答
  • 原文地址:https://www.cnblogs.com/lingr7/p/10294081.html
Copyright © 2011-2022 走看看