PAT 1024. 科学计数法

Posted A-Little-Nut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 1024. 科学计数法相关的知识,希望对你有一定的参考价值。

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。

输入格式:

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

输出格式:

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

输入样例1:

+1.23400E-03
输出样例1:
0.00123400
输入样例2:
-1.2E+10
输出样例2:
-12000000000

就这道破题差点让我心态爆炸〒▽〒,不是因为难,而是因为我因为最后输出时不管加号减号都要加在开头输出,结果是只有减号
独留在风中凌乱的我╮(╯▽╰)╭
下面是代码

#include<iostream>
#include<algorithm> 
#include<string.h>
using namespace std;
bool Iszero(char c){
    return c==‘0‘;
}
int main(){
    string num,zhishu; // num用来储存输入,zhishu为了后面保存string形式的E的指数
    zhishu.resize(4); // 没有这一步,copy(it+1,num.end(),zhishu.begin())是错的,因为copy的输入序列至少能保存下copy的内容啊
    cin>>num; 
    int point_num=0; //point_num记录小数位有多少位
    char c=num[0]; // 用来保存正负号 
    auto it=find(num.begin(),num.end(),‘E‘); // 利用包含在头文件<algorithm>中的find函数返回指向E的迭代器
    copy(it+1,num.end(),zhishu.begin()); // copy‘E‘之后的指数部分进入zhishu
    num.erase(it,num.end()); //把num中E到最后的部分删掉
    point_num=num.length()-3; //小数位位数
    int zhishu2=stoi(zhishu); //把string形式的指数转化为int
    point_num-=zhishu2; //拿原来的小数位数减去指数,如果为负的,说明没有小数点了并且要在后面加零。为正的说明结果的小数位数
    num.erase(find(num.begin(),num.end(),‘.‘)); // 删除原来的小数点
    if(point_num>0){
        if(point_num>=num.length()-1)
        num.insert(num.begin()+1,point_num-(num.length()-1)+1,‘0‘);
        num.insert(num.end()-point_num,1,‘.‘);
    }
    else{
        num.insert(num.end(),-point_num,‘0‘);
    }
//下面是处理结果前面可能存在无意义的零,比如001.003, 000.002 等等
********************************************************
    auto point=find(num.begin(),num.end(),‘.‘);
    if(point!=num.end()){
        it=find_if_not(num.begin()+1,point,Iszero);
        if(it==point) num.erase(num.begin(),it-1);
        else num.erase(num.begin(),it);
    }
    else{
        it=find_if_not(num.begin()+1,num.end(),Iszero);
        num.erase(num.begin(),it);
    }
***********************************************************
    if(c==‘-‘) // 望读者不要和我一样?(ˉ﹃ˉ?)
    num.insert(num.begin(),1,c);
    cout<<num<<endl;
    return 0;
} 

以上是关于PAT 1024. 科学计数法的主要内容,如果未能解决你的问题,请参考以下文章

PAT B1024/A1073 科学计数法

PAT——1024. 科学计数法

PAT 1024. 科学计数法

PAT 1024. 科学计数法 (20)

PAT B1024科学计数法

PAT 1024 科学计数法 段错误