PAT B1024/A1073科学计数法

问题描述:

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][1-9].[0-9]+E[±][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入格式:

每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

输出格式:

对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

输入样例 1:

+1.23400E-03

输出样例 1:

0.00123400

输入样例 2:

-1.2E+10

输出样例 2:

-12000000000

AC代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define maxn 10010



int main()
{
 //   freopen("input.txt","r",stdin);
    char s[maxn];
    char tail[maxn];
    char index[maxn];
    char sym1,sym2;//记录尾数和指数的符号
    int num;
    scanf("%s",s);//得到s
    int len=strlen(s),i,j;//得到字符串的长度
    sym1=s[0];
    tail[0]=s[1];
    for(i=3;i<len;i++)
    {
        if(s[i]=='E')
        {
            break;
        }
        tail[i-2]=s[i];//
    }
    tail[i]='\0';//得到尾数部分
    i++;//得到E的长度
    sym2=s[i++];//得到指数部分的符号
    for(j=0;(j+i)<len;j++)
    {
        index[j]=s[j+i];
    }
    index[j]='\0';
    num=atoi(index);//指数的数值
    int tlen=strlen(tail);
    if(num==0)//指数为0,尾数原封不动
    {
        if(sym1=='-')printf("%c",sym1);
        for(i=0;i<tlen;i++)
        {
            printf("%c",tail[i]);
            if(i==0)printf(".");
        }
    }
    else if(sym2=='-')//指数为负数
    {
        if(sym1=='-')printf("%c",sym1);
        printf("0.");//得到字符串
        for(int i=1;i<num;i++)//还要打印0,
        {
            printf("0");
        }
        printf("%s",tail);
    }
    else//指数为正数
    {
        if(sym1=='-')printf("%c",sym1);
        if(num<tlen-1)//如果小数部分的长度(tlen-1)大于指数num,那么保留小数点
        {
            for(i=0;i<tlen;i++)
            {
                printf("%c",tail[i]);
                if(num==i)printf(".");//指数为0时,小数点打印i==0时候,平移num个单位后打印小数点的位置为第num个数字后(从0开始)
            }
        }
        else
        {//不需要保留小数点
                printf("%s",tail);//直接打印位数部分
            for(i=0;i<num-(tlen-1);i++)
                printf("0");//补末尾的0;
        }
    }




}

2月25日更新代码

#include <stdio.h>
#include <string.h>
#define maxn 10010

int change(char s[])
{
    int flag=1;
    if(s[0]=='-')flag=-1;
    int num=0;
    for(int i=1;i<(int)strlen(s);i++)num=num*10+s[i]-'0';
    if(flag==1)return num;
    else return -num;
}


int main()
{
    //freopen("input.txt","r",stdin);
    char head[2],tail[maxn],index[maxn],sym[1],s[maxn];
    scanf("%s",s);
    sscanf(s,"%[^.].%[^E]E%s",head,tail,index);//过滤.和E
    int cnt=0,n=change(index);
    if(head[0]=='-')
    {
        printf("-");
    }
    if(n<0)
    {
        for(int i=0;i>n;i--)
        {
            printf("0");
            if(i==0)printf(".");
        }
        printf("%c%s",head[1],tail);
    }
    else
    {
        if(strlen(tail)<=n)
        {
            int temp=n-strlen(tail);
            printf("%c%s",head[1],tail);
            while(temp>0)
            {
                printf("0");
                temp--;
            }
        }
        else
        {
            printf("%c",head[1]);//
            for(int i=0;i<n;i++)printf("%c",tail[i]);
            printf(".");
            for(int i=n;i<(int)strlen(tail);i++)
                printf("%c",tail[i]);
        }


    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值