题解 | 特殊的科学计数法
特殊的科学计数法
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")