CF-697BBarnicle与691CExponential notation

来源:互联网 发布:ubuntu ssd 优化 编辑:程序博客网 时间:2024/06/06 23:51

      无聊写两个题解吧,上午做比赛拉的,感触很多!

                                                                   

B. Barnicle
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

        Barney is standing in a bar and starring at a pretty girl. He wants to shoot her with his heart arrow but he needs to know the distance between him and the girl to make his shot accurate.

        题意很简单,学过c语言的看样例就知道什么意思了,就是特殊情况实在太多,写的我好烦!

#include<bits/stdc++.h>using namespace std;const int N=1000+10;char a[N];int main(){    int i,j;    while(~scanf("%s",a))    {        int x=0,k1=0,k2=0;        int len=strlen(a);        int zheng=0;        for(i=0; a[i]!='.'; i++)            zheng=zheng*10+(a[i]-'0');//整数部分        k1=i;        int k3=0;        for(i=len-1;; i--)            if(a[i]=='e')                break;        k2=i;//e的位置;        j=k2-1;        for(j=j; j>=0; j--)            if(a[j]>'0'&&a[j]<='9')                break;        k3=j;//左起第一个不为0的位置,相当于舍去后缀0;        if(zheng==0)//注意题目说了a、b 同时为0;        {            int f=0;            for(i=0; i<=k3; i++)            {                printf("%c",a[i]);                f=1;            }            if(!f) printf("0");//这是防0.0这种样例;            printf("\n");        }        else        {            i=k2+1;            for(i=i; i<len; i++)                x=x*10+(a[i]-'0');            if(x==0)//说明不用移;            {                for(i=0; i<=k3; i++)                    printf("%c",a[i]);                printf("\n");            }            else if(x+k1<k2-1)            {                if(zheng!=0)                    printf("%d",zheng);                i=k1+1;                if(x+k1<=k3)                {                    for(i=i; i<=k3; i++)                    {                        printf("%c",a[i]);                        if(i==x+k1&&i<k3)                            printf(".");                    }                }                else                {                    for(i=i; i<=k3; i++)                        printf("%c",a[i]);                    for(i=i; i<=k1+x; i++)                        printf("0");                }                printf("\n");            }            else if(x+k1==k2-1)            {                if(zheng!=0)                    printf("%d",zheng);                i=k1+1;                for(i=i; i<k2; i++)                    printf("%c",a[i]);                printf("\n");            }            else if(x+k1>=k2)            {                if(zheng!=0)                    printf("%d",zheng);                i=k1+1;                for(i=i; i<k2; i++)                    printf("%c",a[i]);                for(i=k2; i<=k1+x; i++)                    printf("0");                printf("\n");            }////            printf("%d %d %d %d\n",k1,k2,k3,x);        }    }    return 0;}
 思维不行,代码能力勉强可以,导致以上写的比较繁琐,若有不懂的地方欢迎在评论区留言!

   

   C. Exponential notation
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

             You are given a positive decimal number x.

   这道题就是上一题的逆过程,给出这个实数,要你化成p.qEb的形式;

   基本和上面差不多,就是注意一下前缀0与后缀0;

#include<bits/stdc++.h>using namespace std;const int N=1e6+10;char a[N];char b[N];int main(){    int i;    while(~scanf("%s",a))    {        int len=strlen(a);        int k1=0,k2=0,k3=0;        for(i=len-1; i>=0; i--)            if(a[i]>'0'&&a[i]<='9')            {                k3=i;//右起第一个不为0的位置;                break;            }        for(i=0; i<len; i++)            if(a[i]>'0'&&a[i]<='9')            {                k1=i;//左起第一个不为0的位置;                break;            }        for(i=0; i<len; i++)            if(a[i]=='.')            {                k2=i;//找出点的位置;                break;            }        if(k1==k3&&k1==0)//说明只有一位,可能是1、1.0、100这些情况;        {            if(a[k1]=='0')                printf("0\n");            else            {                printf("%c",a[k1]);                if(k2==0)//没有小数点;                {                    if(len==1)                    {                        printf("\n");                        continue;                    }                    else                        printf("E%d\n",len-1);                }                else                {                    if(k2-k1==1)                    {                        printf("\n");                        continue;                    }                    else                        printf("E%d\n",k2-k1-1);                }            }            continue;        }        if(k2==0)        {//            int f=1;            if(a[0]=='.')//第一位就是小数点            {                for(i=k1; i<=k3; i++)                {                    printf("%c",a[i]);                    if(i==k1&&k1!=k3)                        printf(".");                }                printf("E%d\n",k2-k1);            }            else//没有小数点;            {                for(i=k1; i<=k3; i++)                {                    printf("%c",a[i]);                    if(i==k1&&k1!=k3)                        printf(".");                }                if(k1==k3)                {                    printf("\n");                    continue;                }                else                    printf("E%d\n",len-k1-1);            }        }        else        {            if(k2<k1)            {                for(i=k1; i<=k3; i++)                {                    printf("%c",a[i]);                    if(i==k1&&k1!=k3)                        printf(".");                }                printf("E%d\n",k2-k1);            }            else if(k2>=k1&&k2<=k3)            {                for(i=k1; i<=k3; i++)                {                    if(a[i]=='.')                        continue;                    printf("%c",a[i]);                    if(i==k1)                        printf(".");                }                if(k2-k1==1)                {                    printf("\n");                    continue;                }                printf("E%d\n",k2-k1-1);            }            else            {                for(i=k1; i<=k3; i++)                {                    if(a[i]=='.')                        continue;                    printf("%c",a[i]);                    if(i==k1&&k1!=k3)                        printf(".");                }                if(k2-k1==1)                    continue;                printf("E%d\n",k2-k1-1);            }        }    }    return 0;}
   这个代码看起来貌似没有上一题那么复杂,主要是思维思路要清晰,找好方法,一遍A;

   下面就这两题说说我的感想吧:

    就在昨天,我悟出了一个很重要又很平凡的方法。就是:做题,千万要想好思路再去写,思路清晰了代码自然很快就出来了,可是思维很混乱脑袋模模糊糊或者有一点想法就着手写,写出来是运气,写不出来(卡壳)是正常,就是这样不知道浪费了多少时间;一个题,静下心来做不会发很多时间(个人认为),可是往往大部分时间就是心浮气躁,往往一卡壳就又得停下来分析,最后发现思路错了,等于一直在做无用功,题没做出来时间又过去了,效率低下!!

     





0 0
原创粉丝点击