zoukankan      html  css  js  c++  java
  • ACM——【百练习题备忘录】

    1. 在做百练2807题:两倍时,错将判断语句写成 a/b ==2,正确写法是:a == b*2

    因为C/C++int型做除法时自动舍入,如:5/2 == 2,但是 5 =/= 2*2。

    2. 在做百练2715题:谁拿了最多奖学金时,一直Wrong Answer,最后才发现真的是自己算错了,在判断语句中>85写成了>80

    3. 在做百练2713: 肿瘤面积时,一开始提交显示 Runtime Error,一看是数组开小了,可能的数据是n不大于1000,我定义的时候是105;修改数组大小后再次提交显示Wrong Answer。

    4. 百练2798:2进制转化为16进制没做出来。

    5. 百练2818:密码,

      1)Wrong Answer:结果错误

      2)Time Limit Exceeded:暴力求解,超时

      3)Presentation Error:每一个块结束都要输出换行符' '

      4)Runtime Error:数组越界,数组开的太小

    6. 百练2972:确定进制,注意k进制数N的每一位都比k小。

    7. C++调用iostream中的ios::sync_with_stdio(false)以提高I/O效率

    8. 百练2974:487-3279,Runtime Error,数组开小了

    9. 百练2798:2进制转化为16进制:

    int num = len % 4;
    int base=1;
    for(int i=num-1;i>=0;i--){
        ch += (bin[i]-'0')*base;
        base *= 2;
    }
    printf("%X",ch);

    当num=0时,按照逻辑,后面的代码不应该输出,因此出错,解决方法是判断num不为0即可,或num为整数。

    10. 百练题目2705:用算术式子再做一次。

    11. 百练2707:别人的代码:

    #include <cstdio>
    #include <cmath>
    int main()
    {
        int n;
        scanf("%d",&n);
        while(n--){
            double a,b,c;
            double pd;
            double part1,part2;
            scanf("%lf %lf %lf",&a,&b,&c);
            if (a < 0){
                        a = 0 - a;
                        b = 0 - b;
                        c = 0 - c;
                    }
            pd=b*b-4*a*c;
            part1 = (0 - b)/ (2 * a);
            if(pd>0){
                part2 = sqrt(pd)/(2 * a);
                printf("x1=%.5lf;x2=%.5lf
    ",part1+part2,part1-part2);
            }else if(fabs(pd)<1e-8){
                printf("x1=x2=%.5lf
    ",part1);
            }else{
                part2 = sqrt(0 - pd)/ (2 * a);
                printf("x1=%.5lf+%.5lfi;x2=%.5lf-%.5lfi
    ",part1,part2,part1,part2);
            }
        }
        return 0;
    } 

    来源:http://www.cnblogs.com/xzt6/p/5730697.html

    对于以下问题:

    实测情况为:

    1. -b/(2*a)即可;
    2. b=0时,若将结果分成real和img,则不存在上述问题;
    3. -0.00000似乎不影响结果正确性。

    总上所述,关键是用double类型取代float类型和对delta判等用一个极小值例如1e-8。

    12. 百练2724:可以用C++<map>实现,代码量更少。

    13.百练2856:输出用

    printf("%g
    ",0.8+0.5*fmax(w-1,0.0)+(exp=='y'?2:0));

    14. 百练2683:该数列一开始看成是Fibonacci数列中的后一项/前一项,所以实现时用fibonacci数列进行模拟,发现对于次数99来说,无论是int型还是long型,都有数据溢出。看两年前的提交记录,才发现,该数列满足:a[n] = 1/a[n-1] + 1,于是用此思路迎刃而解。还是感叹人在不同时候的思路是很不同的。此题给人的警示是:当循环有数据溢出时,可以考虑发现数列的通项公式。

    15. 百练2697:题目出错了,x = (x1+x2)/2,而不是x = (x2-x1)/2;是f(0)>0而不是f(a)>0。真想骂人,出题能不能走点心。

    16. 百练2868:题目出错了,输入不是一个数,而是若干输入,需要用 while(EOF!=scanf("%lf",&num)) ,不然会报 Wrong Answer ,真心觉得出题人谨慎点行不行,POJ本来就不给出错案例,要想Accepted,就必须考虑所有边界条件,就必须严格按照题目要求进行输入输出,这下好了,输入条件都不明确,还怎么做题!

    17. 百练2682:循环移动这道题很经典,可以用三次reverse操作来实现。 

    18. 百练2938:交换两个整数可以用:

    a = a^b;
    b = a^b;
    a = a^b;

    来实现。

    19. switch后面只能跟整型变量和字符型变量,不能接字符串。 

    20. a%b时,b一定非0.

    21. 输出浮点数时,若对精度无要求,建议使用"%g"修饰符。 

    参考资料:

  • 相关阅读:
    15_门面模式
    14_责任链模式
    13_观察者模式
    12_状态模式
    11_策略模式
    10_命令模式
    09_适配器模式
    08_装饰者模式
    07_代理模式
    linux邮件服务器postfix配置实例
  • 原文地址:https://www.cnblogs.com/oddcat/p/9704117.html
Copyright © 2011-2022 走看看