pat 乙级1024 科学计数法关于stl中size()的一些思考即测试点六,无符号整数问题

时间:2022-11-26 00:41:44

来,先看题目:1024 科学计数法
分数 20 作者 HOU, Qiming 单位 浙江大学
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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<bits/stdc++.h>
using namespace std;
int main(){
    string a,b;cin>>a;
    if(a[0]=='-')cout<<"-";
    //int i;//i-2位数,小数i-3
    int num;
    int pos=a.find('E');
    if(a[pos+1]=='-')num=(-1)*stoi(a.substr(pos+2));
    else num=stoi(a.substr(pos+2));
    int youxiaowei=-pos+3+num;
    for(int i=0;i<pos;i++){
        if(isdigit(a[i]))b=b+a[i];
    }
    int k=youxiaowei;
    k=k+b.size();
    if(youxiaowei<0){
        if(k<=0){
            cout<<"0.";
            for(int i=0;i<-1*k;i++)cout<<"0";
            cout<<b<<endl;
        }
        else{//测试点3,4  测试样例:+1.234E+01;
            int cnt=0;
            while(k-cnt!=0){
                cout<<b[cnt++];
                
            }
            cout<<"."<<b.substr(cnt);
            
        }
    }
    else{
        cout<<b;
        for(int i=0;i<(youxiaowei);i++)cout<<"0";
        cout<<endl;
    }
    
    return 0;
}
// #include<bits/stdc++.h>
// using namespace std;
// int main(){
//     string a,b;cin>>a;
//     if(a[0]=='-')cout<<"-";
//     //int i;//i-2位数,小数i-3
//     int num;
//     int pos=a.find('E');
//     if(a[pos+1]=='-')num=(-1)*stoi(a.substr(pos+2));
//     else num=stoi(a.substr(pos+2));
//     int youxiaowei=-pos+3+num;
//     for(int i=0;i<=pos;i++){
//         if(isdigit(a[i]))b=b+a[i];
//     }
//     int k=youxiaowei;
//     k=k+b.size();
//     if(youxiaowei<0){
//         if(k<=0){
//             for(int i=0;i<-1*k;i++)b="0"+b;
//             b="0."+b;
//         }
//         else{
//             b=b.substr(0,b.size()+youxiaowei)+"."+b.substr(b.size()+youxiaowei);
//         }//注意b.size()是一个无符号整数,如果它直接和另一个数相运算且结果小于0;则会出错测试点6
//     }
//     else{
//         for(int i=0;i<(youxiaowei);i++)b+="0";
//     }
//     for(int i=0;b[i]=='0';){
//         if(b.find('.')==1)break;
//         else b.erase(0,1);
//     }
//     if(b!="")
//         cout<<b;
//     else cout<<0<<endl;
//     return 0;
// }

总结:一个无符号整数,如果它直接和另一个数相运算且结果小于0。运算得到的结果就不是小于0,而是它的存储的补码所构成的无符号整数,是一个非常大的数。所以,使用size()的时候当万分注意