题解 | 特殊的科学计数法

特殊的科学计数法

https://www.nowcoder.com/practice/ca0962879d3b40d8bb598fb9a905ac7a

#include <iostream>
#include <cstring>
using namespace std;
/*
     用double会爆掉,那我们就考虑用字符串试试
*/

int main() {
    string s;
    while (cin >> s) { // 注意 while 处理多个 case
        int a,b,k,c;//a,b,c分别为我们需要用到的3个数字,k则是我们10的幂次方
        if(s.size()==1) cout<<s<<'.'<<0<<endl;//防止输入的数为个位数
        else{
        a=s[0]-'0';//把字符串转换成数字,便于后面考虑进位
        if(a>0)//两种情况,第一种是大于10的
        {
            b=s[1]-'0';
            k=s.size()-1;//因为是大于10的数,字符串长度-1就是我们的10的几次幂
            if(s.size()>2) c=s[2]-'0';//判断此时的c合不合法,否侧会出问题
            else c=0;
            do{
                if(c>=5) b++,c=0;
                if(b>=10) a++,b=0;
                if(a>=10) a/=10,k++;
            }while(a>=10);//进位
        }
        else if(a==0)//说明是0.几,因为输入的值一定是合法的,所以a为0时就能判断了
        {
            int i=2;//最前面的0和.占了2位,所以i从2开始判断
            k=-1;
            while(s[i]=='0') i++,k--;//判断出小数点后面的第几位为非零项,k也就能得出来
		  //例如0.0001,小数点后第4位是非0值,k就为-4
            a=s[i]-'0';
            if(i+1>s.size()-1) b=0;//这时候要考虑b的合法性
            else b=s[i+1]-'0';
            if(i+2>s.size()-1) c=0;
            else c=s[i+1]-'0';
            do{
                if(c>=5) b++,c=0;
                if(b>=10) a++,b=0;
                if(a>=10) a/=10,k++;
            }while(a>=10);
        }
        cout<<a<<'.'<<b<<'*'<<10<<'^'<<k<<endl;
        }
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务