题意:
就是给出一个科学计数法的字符串,要求输出表示的整数
思路分析:
首先考虑数的正负号,如果字符串第一个字符s[0]是'-',则应先输出'-',否则原样输出。之后获取指数的值,在此之前需要先取得'E'的下标index,而后从index+2向后枚举字符串,并将字符串转为10进制,即为指数exp。
1.如果s[index+1]='-'即指数为负数,说明小数点需要向左移,故而先计算前导0的个数qiandao
,qiandao = exp-1。输出的方法为:先输出"0.",而后输出qiandao个数的0,之后原样输出'E'之前的系数部分,碰到'.',则不输出。
2.如果s[index+1]='+'即表示指数为正数,小数点需要右移,而需要输出的后导0的个数为exp-index+3
(自己推导下),原样输出'E'之前系数部分时,当枚举变量i==exp+2
时则还需输出一个'.',当然此时不需要输出后导0。
注意点
- 指数部分有可能为+0,-0;这种情况下应该原样输出
- 注意模拟过程中.应该放的位置。
参考代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
char s[maxn];
int main(void){
scanf("%s",s);
int len = strlen(s);
int index = strchr(s,'E') - s; //找到E的下标位置
if(s[0] == '-') cout<<"-";
int exp = 0; //指数
for(int i = index + 2;i < len;i++) {
exp = exp*10 + s[i] - '0';
}
if(exp == 0) { //如果指数为0,则原样输出
for(int i = 1;i < index;i++) cout<<s[i];
} else {
if(s[index+1] == '-') { //如果指数为负数
int qiandao = exp - 1; //计算需要输出的前导0
cout<<"0.";
for(int i = 0;i < qiandao;i++) cout<<"0"; //输出前导0
for(int i = 1;i < index;i++) {
if(s[i] == '.') continue;
cout<<s[i];
}
} else if(s[index+1] == '+') {
for(int i = 1;i < index;i++) {
if(s[i] == '.') continue;
cout<<s[i];
if(i == exp+2 && i != index-1) cout<<".";
}
if(exp > index - 3) { //输出后导0;
for(int i = 0;i < exp-index+3;i++) cout<<"0";
}
}
}
return 0;
}
总结
本题细节较多,需要注意一些特殊地方的处理