CF-697B Barnicle与691C Exponential notation

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

                                                                   

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;
}
 思维不行,代码能力勉强可以,导致以上写的比较繁琐,若有不懂的地方欢迎在评论区留言!

   

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;

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

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

     





转载于:https://www.cnblogs.com/nyist-TC-LYQ/p/7208206.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值