B 1024/A 1073
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
char s[1000001];//存放初始数据
char m[1000001];//存放中间的数字
char m1[1000];//存放指数的数字
cin>>s;
int b=0,t=0;//b代表指数的正负,t存放指数部分 0 代表正 1代表负
if(s[0]=='-') cout<<"-";//输出该数字的正负号
long long i,j=0;
for( i=1;i<strlen(s);i++)
{
if(s[i]=='.') continue;
if(s[i]=='E') break;
m[j++]=s[i];
}
if(s[++i]=='-') b=1;
int j1=0;//标志着指数部分第一次出现非0数字
for(++i,j=0;i<strlen(s);i++)
{
if(s[i]!='0'||j1==1)
{
m1[j++]=s[i];
j1=1;
}
}
for(i=0;i<strlen(m1);i++)
{
t+=(m1[i]-'0');
t*=10;
}
t=t/10;//用于存放指数int型
if(b==0&&strlen(m)-1<=t)//说明此时没有小数点
{
for(i=0;i<strlen(m);i++)
{
cout<<m[i];
}
for(i=1;i<=t+1-strlen(m);i++)
cout<<'0';
return 0;
}
if(b==0)//指数是正数,有小数点的情况
{
for(i=0;i<=t;i++)
{
cout<<m[i];
}
cout<<".";
int l1=strlen(m);
for(;i<strlen(m);i++)
cout<<m[i];
return 0;
}
//指数是负数,说明肯定有小数点
cout<<"0.";
for(i=1;i<t;i++)
cout<<'0';
for(i=0;i<strlen(m);i++)
cout<<m[i];
}
以下代码参考 【有小小的改动】
(31条消息) 测试点错的来:1024 科学计数法 (20分)_来老铁干了这碗代码的博客-CSDN博客
#include<iostream>
using namespace std;
int main() {
char cc[10000]; long long x2; char c1, c2, c3;
scanf("%c%c.%[^E]E%c%lld", &c1, &c3, cc, &c2, &x2);//绝了,看这里!!!!!!!!
string s;
if(c2 == '-') {
for(int i = 0; i < x2; i++) {
if(i==1) s += '.';
s += '0';
}
s += c3;
s += cc;
} else {
s+= c3;
s+= cc;
if(s.length()-1 < x2) {//代表小数点后的位数小于指数 需要补0
int len = s.length()-1;
for(int i = 0; i < x2-len; i++)
s+='0';
} else if(s.length() -1> x2){//代表小数点后的位数大于指数 不需要补0 需要小数点
s.insert(x2+1, ".");//在字符串中一开始小数点的位置在1上,平移x2个位置,字符串第x2+1个位置上,
}
}
if(c1=='-') s.insert(0,"-");
cout << s;
return 0; }
柳神的代码也很好,如下