PAT A1073

题意:

就是给出一个科学计数法的字符串,要求输出表示的整数

思路分析:

首先考虑数的正负号,如果字符串第一个字符s[0]是'-',则应先输出'-',否则原样输出。之后获取指数的值,在此之前需要先取得'E'的下标index,而后从index+2向后枚举字符串,并将字符串转为10进制,即为指数exp。

1.如果s[index+1]='-'即指数为负数,说明小数点需要向左移,故而先计算前导0的个数qiandao,qiandao = exp-1。输出的方法为:先输出"0.",而后输出qiandao个数的0,之后原样输出'E'之前的系数部分,碰到'.',则不输出。

2.如果s[index+1]='+'即表示指数为正数,小数点需要右移,而需要输出的后导0的个数为exp-index+3(自己推导下),原样输出'E'之前系数部分时,当枚举变量i==exp+2时则还需输出一个'.',当然此时不需要输出后导0。

注意点

  • 指数部分有可能为+0,-0;这种情况下应该原样输出
  • 注意模拟过程中.应该放的位置。

参考代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
char s[maxn];

int main(void){
    scanf("%s",s);
    int len = strlen(s);
    int index = strchr(s,'E') - s;      //找到E的下标位置
    if(s[0] == '-') cout<<"-";
    int exp = 0;        //指数
    for(int i = index + 2;i < len;i++) {
        exp = exp*10 + s[i] - '0';
    }
    
    if(exp == 0) {          //如果指数为0,则原样输出 
        for(int i = 1;i < index;i++) cout<<s[i];
    } else {
        if(s[index+1] == '-') {         //如果指数为负数 
            int qiandao = exp - 1;      //计算需要输出的前导0
            cout<<"0.";
            for(int i = 0;i < qiandao;i++) cout<<"0";       //输出前导0 
            for(int i = 1;i < index;i++) {
                if(s[i] == '.') continue;
                cout<<s[i];
            }
        } else if(s[index+1] == '+') {
            for(int i = 1;i < index;i++) {
                if(s[i] == '.') continue;
                cout<<s[i];
                if(i == exp+2 && i != index-1) cout<<".";
            }
            if(exp > index - 3) {       //输出后导0; 
                for(int i = 0;i < exp-index+3;i++) cout<<"0";
            }
        }
    }
    return 0;
}

总结

本题细节较多,需要注意一些特殊地方的处理

猜你喜欢

转载自www.cnblogs.com/Western-Trail/p/10328384.html