分析:
- 将输入的实数A分成几部分分别存放
- 根据题意判断这几部分并输出
思路(参考输入样例+1.23400E-03,依次读入字符):
-
opt1存储’+’,opt2存储’-’;char s[10000] 存储"1.23400",int num存储"03"
-
符号位:opt1为正就不输出,负就输出
-
opt2为负:左移小数点num位
先输出num个0(格式为0.000…),再输出s1(不输出小数点)
考虑num为0的特殊情况 -
opt2为正:右移小数点num位
如果移动过程中小数点到了最右边,输出多余的0,去除小数点
未到最右边,右移小数点num位即可
#include <iostream>
using namespace std;
int main() {
char opt1, opt2;
char s[10000];
int num, count = 0;
cin >> opt1; //读取正负号
cin >> s[count++];
while('E' != s[count-1])
cin >> s[count++];
cin >> opt2; cin >> num;
if('-' == opt1) { cout << opt1;} //输出符号位 负号
if('-' == opt2) { //左移
if(0 != num) {printf("0."); num--;} //输出因为左移而多
for(int i = 0; i < num; i++)
cout << '0';
for(int i = 0; i < count - 1; i++) //输出s,count-1,不输出E
if('.' != s[i])
cout << s[i];
}
if('+' == opt2) { //右移
//count表示s的元素个数(包括E),小数点在第2个,
//所以小数点移动count-2次就到了最右边,只能移动count-3次才保证能输出小数点
if(num <= count-3) { //小数点移位未到最右边
for(int i = 0; i < count-1; i++) {
if(2+num == i) {cout << '.';}
if('.' != s[i]) {cout << s[i];}
}
}
if(num > count-3) { //到了最右边
for(int i = 0; i < count-1; i++)
if('.' != s[i]) {cout << s[i];}
for(int i = 0; i < num-count+3; i++)//小数点移动了count-3位,还要加num-(count-3)个0
cout << '0';
}
}
}
反馈:
- 这个思路可以AC,但是花了我一个小时,有点久了吧…
- 写得我头晕
反思:
- debug的时候,for循环里i++写成了count++,一直没找出来…有20min左右在找它
- 以后如果出现无限循环的bug,优先检查for循环条件