美文网首页PAT
1024.科学计数法

1024.科学计数法

作者: yzbkaka | 来源:发表于2018-08-02 17:02 被阅读4次

    题目描述

    科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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;
    }
    

    相关文章

      网友评论

        本文标题:1024.科学计数法

        本文链接:https://www.haomeiwen.com/subject/efjsvftx.html