zoukankan      html  css  js  c++  java
  • 编程题A+B Format的总结(第二次作业<一>)

    Github链接地址:https://github.com/Startup-try/object-oriented
    这个题目现在想想没有那么难,其实还挺简单的,但是中午花了好长的时间还不懂得怎么做,感觉要做出内伤。晚饭吃后,又查了一遍下午查资料没搞懂的"03d"——输出一个数,不足3位在前面补0,后面就比较顺利地将这个题目解出来。
    这个题目主要的难点是在输出a+b的和的格式上,题目要求用标准形式输出即当和值为4位及4位以上,从右边往左每隔3位数要加个逗号,这是我在之前都没做过的。最开始是以为C语言中有以标准形式输出的函数,找了找,发现没有。后面不知道怎么下手就去网上看有没有什么方法,看到了班级同学是怎么做的,大致看一下,没有很细致地去看,明白了用"%d,%d"这样的形式就能按照题目的要求输出标准形式,知道了是这样子做后就自己动手去打代码。一开始的思路是第一个逗号前的数用c除以某个确切的数来得到,第一个逗号后的数用a除以某个确切的数+b除以某个确切的数得到,算得差点没出内伤:一直错,一直改,改了还是错。敲得代码真的是又臭又长,总结原因,是自己算法出了大问题。一开始写的代码:

    include<stdio.h>

    int main()
    {
    int a,b,c,i=0,temp,a0,a1,a2,b0,b1,b2,t=0;
    scanf("%d %d",&a,&b);
    c=a+b;
    if((c>0&&c<1000)||(c<0&&c>-1000))
    printf("%d",c);
    else if((c>1000&&c<1000000)||(c>-1000000&&c<-1000)){
    c=c/1000;
    a=a%1000;
    b=b%1000;
    if((a+b)%10000)
    printf("%d,%d%d%d",c,t,t,t);
    else if((a+b)%1000<100)
    printf("%d,%d%d",c,t,(a+b)%1000);
    else
    printf("%d,%d",c,(a+b)%1000);
    }
    if((c>1000000&&c<3000000)||(c<-1000000&&c>-2000000)){
    c=c/1000000;
    a0=a;
    a=a%1000;
    a1=a;
    a0=a0/1000;
    a0=a0%1000;
    a2=a0;
    b0=b;
    b=b%1000;
    b1=b;
    b0=b0/1000;
    b0=b0%1000;
    b2=b0;
    if(((a2+b2)%1000
    0)&&((a1+b1)%1000==0))
    printf("%d,%d%d%d,%d%d%d",c,t,t,t,t,t,t);

    else if(((a2+b2)%1000==0)&&((a1+b1)%1000<100))
    printf("%d,%d%d%d,%d%d",c,t,t,t,t,(a1+b1)%1000);

    else if(((a2+b2)%1000==0)&&((a1+b1)%1000>100))
    printf("%d,%d%d%d,%d",c,t,t,t,(a1+b1)%1000);

    else if(((a2+b2)%1000<100)&&((a1+b1)%1000>100))
    printf("%d,%d%d,%d",c,t,(a2+b2)%1000,(a1+b1)%1000);

    else if(((a2+b2)%1000<100)&&((a1+b1)%1000==0))
    printf("%d,%d%d,%d%d%d",c,t,(a2+b2)%1000,t,t,t);

    else if(((a2+b2)%1000<100)&&((a1+b1)%1000<100))
    printf("%d,%d%d,%d%d",c,t,(a2+b2)%1000,t,(a1+b1)%1000);

    else if(((a2+b2)%1000>100)&&((a1+b1)%1000==0))
    printf("%d,%d,%d%d%d",c,(a2+b2)%1000,t,t,t);

    else if(((a2+b2)%1000>100)&&((a1+b1)%1000<100))
    printf("%d,%d,%d%d",c,(a2+b2)%1000,t,(a1+b1)%1000);

    else
    printf("%d,%d,%d",c,(a2+b2)%1000,(a1+b1)%1000);
    }
    return 0;
    }
    拿去裁判,一直是5分,6分。

    饭后自己去查了资料,不知道怎么就懂得用c除以某个确切的数来得到逗号前后各个数,而且很快就写好了代码。但并不是一下子就全部正确,这中间也经历了两次提交的时候忘了把自己用于测试的代码删掉,导致全部错误,最严重的是把可能为负数的情况忘了考虑。写好了对于整数可行的代码,拿上去裁判,发现才得5分,觉得想不通,后面把示例拿去测试一下才发现忘了考虑结果为负数的情况,然后就去补上,拿去裁判,发现全部正确。好开心、好开心、好开心。忘了将测试代码删了导致全部错误:全部正确的:

    正确的代码:

    include<stdio.h>

    int main()
    {
    int a,b,c,t,i,j,m;
    scanf("%d %d",&a,&b);
    c=a+b;
    t=i=j=m=c;
    if((c>=0&&c<1000)||(c<=0&&c>-1000))
    printf("%d",c);
    else if((c>=1000&&c<1000000)||(c>-1000000&&c<=-1000)){
    c/=1000;
    t=t%1000;
    if(t<0)
    t=-t;
    printf("%d,%03d",c,t);
    }
    else if((c>=1000000&&c<=2000000)||(c<=-1000000&&c>=-2000000)){
    c/=1000000;
    m%=1000000;
    j=m/1000;
    i%=1000;
    if(j<0)
    j=-j;
    if(i<0)
    i=-i;
    printf("%d,%03d,%03d",c,j,i);
    }
    return 0;
    }
    总结:一开始还没注意到a,b是整数,定义了double类型的a,b。这个考的知识点主要是“/”,“%”的用法。整数类型的a,/10几次方(小于a)就是干掉后面几位,%10几次方,就是保留后面几位。 做完了这个题目觉得自己收获还是蛮大的,不可否认,吃完晚饭后,头脑有想过不懂得怎么做就算了,后面自己还能做出来,感觉挺不错的。还有,我想,可能并不是晚饭后就莫名其妙地知道怎么做, 更有可能还是与中午大半天的琢磨有很大关系——就像吃前9个馒头没感觉饱等到第10个才觉得一样,所以还是得多练!

  • 相关阅读:
    Java垃圾回收
    Android Starting Window(Preview Window)
    JVM虚拟机结构
    表驱动法 -《代码大全》读书笔记
    快速Android开发系列网络篇之Retrofit
    快速Android开发系列网络篇之Volley
    快速Android开发系列网络篇之Android-Async-Http
    清除Android工程中没用到的资源
    快速Android开发系列通信篇之EventBus
    Android点击列表后弹出输入框,所点击项自动滚动到输入框上方
  • 原文地址:https://www.cnblogs.com/startup-try/p/5174734.html
Copyright © 2011-2022 走看看