PAT

1024.科学计数法

2018-08-02  本文已影响4人  yzbkaka

题目描述

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

输入描述

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

输出描述

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

输入例子

+1.23400E-03

输出例子

0.00123400

我的代码

//代码不是满分
#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
    char a[9999];
    int i,j,len,b;
    double sum;
    scanf("%s",a);
    len=strlen(a);
    sum=a[1]-'0';
    if(a[0]=='+'){
        if(a[len-3]=='-'){
            b=(a[len-1]-'0')+(a[len-2]-'0')*10;
            printf("0.");
            for(i=0;i<b-1;i++){
                printf("0");
                }
            printf("%c",a[1]);
            for(i=3;a[i]!='E';i++){
                printf("%c",a[i]);
            }
        }
        if(a[len-3]=='+'){
            b=(a[len-1]-'0')+(a[len-2]-'0')*10;
            printf("%c",a[1]);
            if(b<=len-7){
            for(i=3;i<3+b;i++){
                printf("%c",a[i]);
            }
            printf(".");
            for(i;a[i]!='E';i++){
                printf("%c",a[i]);
            }
        }
        if(b>len-7){
            for(i=3,j=0;a[i]!='E';i++){
            printf("%c",a[i]);
            j++;
            }
            for(i=0;i<b-j;i++){
                printf("0");
            }
        }
     } 
    }
    if(a[0]=='-'){
        if(a[len-3]=='-'){
            printf("-");
            b=(a[len-1]-'0')+(a[len-2]-'0')*10;
            printf("0.");
            for(i=0;i<b-1;i++){
                printf("0");
                }
            printf("%c",a[1]);
            for(i=3;a[i]!='E';i++){
                printf("%c",a[i]);
        }
            }
            if(a[len-3]=='+'){
                printf("-");
            b=(a[len-1]-'0')+(a[len-2]-'0')*10;
            printf("%c",a[1]);
                if(b<=len-7){
            for(i=3;i<3+b;i++){
                printf("%c",a[i]);
            }
            printf(".");
            for(i;a[i]!='E';i++){
                printf("%c",a[i]);
            }
        }
        if(b>len-7){
            for(i=3,j=0;a[i]!='E';i++){
            printf("%c",a[i]);
            j++;
            }
            for(i=0;i<b-j;i++){
                printf("0");
            }
        
        }       
    }
  }
    return 0;
} 

我的分析

其实我对这道题的思路比较简单,就是对输入的一串字符进行判断,然后再分情况进行输出,但是我写的代码的局限性就是只能够正确判断指数在100以内的运算,一旦超过100就要分情况对代码进行大范围的修改,很耗时间,所以就不继续修改下去。
其实这道题毫无算法可言,在考试的时候就是拼的耐心,虽然我这道题只得了14分,在短时间内能够正确通过三个范例,在紧张的时间内也还是很划得来的。

正确代码

//别人的满分代码
#include <iostream>
using namespace std;
int main() {
    string s;
    cin >> s;
    int i = 0;
    while (s[i] != 'E') i++;
    string t = s.substr(1, i-1);
    int n = stoi(s.substr(i+1));
    if (s[0] == '-') cout << "-";
    if (n < 0) {
        cout << "0.";
        for (int j = 0; j < abs(n) - 1; j++) cout << '0';
        for (int j = 0; j < t.length(); j++)
            if (t[j] != '.') cout << t[j];
    } else {
        cout << t[0];
        int cnt, j;
        for (j = 2, cnt = 0; j < t.length() && cnt < n; j++, cnt++) cout << t[j];
        if (j == t.length()) {
            for (int k = 0; k < n - cnt; k++) cout << '0';
        } else {
            cout << '.';
            for (int k = j; k < t.length(); k++) cout << t[k];
        }
    }
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读