标题:练习题,求高手出手!
只看楼主
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
结帖率:100%
已结贴  问题点数:20 回复次数:5 
练习题,求高手出手!
大家看看,怎么可以很好地处理好数据输入输出?

题目描述
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分
只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。

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

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

输入例子:
+1.23400E-03

输出例子:
0.00123400
搜索更多相关主题的帖子: 编写程序 练习题 科学家 表达式 绝对值 
2017-02-16 13:23
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
貌似就是将科学计数法转换为浮点数吧?貌似我曾经作一道题写过一个类似的,将字符串转换为浮点数,可以识别科学计数法,我找找。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-16 13:50
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:9 
不知道符不符合你的要求。
程序代码:
#include <stdio.h>
#include <ctype.h>
#define MAXLINE 100
double atof(char s[]);
int getline(char s[],int max);
int main(void)
{
    char line[MAXLINE];
    
    while(getline(line,MAXLINE) > 0)
        printf("%lf\n",atof(line));

 
    printf("Bye!\n");
    return 0;
}

int getline(char s[], int max)
{
    int i, c;

    for(i = 0; i < max - 1 && (c = getchar()) != EOF && c != '\n'; i++)
        s[i] = c;

    if(c == '\n')
        s[i++] = c;

    s[i] = '\0';

    return i;
}

double atof(char s[])
{
    double val, power,powers;
    int i,sign,signs,exp;

    for(i = 0; isspace(s[i]); i++)//跳过空白字符 
        ;
    sign = (s[i] == '-')?-1:1;//判断正负 

    if(s[i] == '+' || s[i] == '-')//跳过正负符号 
        i++;

    for(val = 0.0; isdigit(s[i]); i++)//计算小数点前的数值 
        val = 10.0 * val + (s[i] - '0');

    if(s[i] == '.')
        i++;

    for(power = 1.0; isdigit(s[i]); i++)//计算小数点后的数字 
    {
            val = 10.0 * val + (s[i] - '0');
            power *= 10.0;
    }
    //判断字符串是不是科学计数法,是则计算,否则返回 
    if(s[i] == 'E' || s[i] == 'e')
    {
       i++;//跳过字符E或e 
       signs = (s[i] == '-')?-1:1;//判断指数的正负 
       if(s[i] == '-' || s[i] == '+')//跳过指数的正负符号 
           i++;
       if(isdigit(s[i]))
       {
           for(exp = 0;isdigit(s[i]); i++)
               exp = 10 * exp + (s[i] - '0');
           for(powers = 1.0; exp > 0; exp--)
              powers *= 10.0;
       }
    }
    else
        return sign * val / power;
     
    if(signs == -1)
        return sign * (val / power / powers);
    else
        return sign * (val / power * powers);
}


[此贴子已经被作者于2017-2-16 14:05编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-16 13:51
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:11 
程序代码:
#include <stdio.h>

void putnch( size_t n, char ch )
{
    while( n-- )
        putchar( ch );
}

int main( void )
{
    char sign;
    char valid[10000];
    int valid_len;
    int power;

    if( 4 == scanf("%c%c.%[^E]%nE%d",&sign,valid,valid+1,&valid_len,&power) )
    {
        valid_len -= 2;

        if( sign == '-' )
            putchar( '-' );

        if( power < 0 )
        {
            printf( "0." );
            putnch( -power-1, '0' );
            puts( valid );
        }
        else if( power < valid_len-1 )
        {
            printf( "%.*s.%s\n", power+1, valid, valid + power+1 );
        }
        else
        {
            printf( "%s", valid );
            putnch( power-valid_len+1, '0' );
            putchar( '\n' );
        }
    }

    return 0;
}

2017-02-16 14:33
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
得分:0 
回复 2楼 renkejun1942
但要保留原数据的后面的0
2017-02-16 14:33
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
得分:0 
回复 4楼 rjsp
哦,谢谢你!查到了,谢谢,学习了!!!

[此贴子已经被作者于2017-2-16 16:11编辑过]

2017-02-16 14:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-474263-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023974 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved