PAT - A1073

1073 Scientific Notation (20point(s))

  • 小数点移动的边界条件

    • 小数点左移
      • 超过数据左边界
    • 小数点右移
      • 未超过数据右边界
      • 超过数据右边界
      • +0.1E+2 --> 10 当科学计数法首位为0时,输出略过0
  • 源码

#include<bits/stdc++.h>

using namespace std;
bool nsign = true; // T -> + F -> -
int pos; // 小数点位置
char A[10000]; // 初值为0
char In[10000]; // 输入字符串

int getexp(char S[]);

int main(void) {
    int index = 0; // 输入字符串索引
    int index_A = 0; // 生成字符串索引
    scanf("%s", In);
    if (In[0] == '-') nsign = false;

    for (index = 1; In[index] != 'E'; ++index) {
        if (In[index] != '.') {
            A[index_A++] = In[index];
        }
        else pos = index_A; // 一般来说等于 2
    }
    // 退出循环时 In[index] == 'E'

    pos = pos + getexp(In + index + 1); // 得到指数数值,确定小数点位置

    if (In[0] == '-') printf("-");

    if (pos <= 0) {
        for (int i = pos - 1; i < index_A; ++i) {
            if (i < 0) {
                printf("0");
                if (i == pos - 1) printf(".");
            }
            else printf("%c", A[i]);
        }
    } else if (pos > 0 && pos < index_A) {
        for (int i = 0; i < index_A; ++i) {
            if (i == pos) printf(".");
            printf("%c", A[i]);
        }
    } else if (pos >= index_A) {
        for (int i = 0; i < pos; ++i) {
            if (i < index_A) printf("%c", A[i]);
            else printf("0");
        }
    }

    printf("\n");

    return 0;
}

int getexp(char S[]) {
    int exp = 0;
    for (int i = 1; i < strlen(S); ++i)
        exp = exp * 10 + S[i] - '0';
    if (S[0] == '-') exp = -exp;
    return exp;
}

posted @ 2020-02-28 01:56  XiuyuanLee  阅读(119)  评论(1)    收藏  举报