题目大意:以科学计数法表示以一个实数A,按普通输出A,并保证所有有效位都保留,包括末尾的0。
思路:
1.以字符串方式读入给出的实数A,保存在数组str中。(编号从0开始)
2.str[0]为符号位,照原样输出。str[1]为A的第一位数字,str[2]中为小数点。
3.定位E的位置,记录在int型变量pos中,从str[1]开始遍历字符串,直到str[pos] == ‘E’。
4.计算指数。str[pos+1]为指数符号,保存。str[pos]+2至结尾为指数部分,转换为int型,保存为exp为指数绝对值。
5.输出:
1)如果指数为负,小数点应该前移,则输出形式为0.000…0xxxx,其中小数点后0的个数为(exp-1)个,后面xxx部分为字母E前所有数字。
2)如果指数为正,小数点应该后移,后移的位数为exp。原数中小数点在str[2],所以新小数点在str[exp+2]位置。
注意,字母E即pos位置与小数点位置之间的数字个数为pos-3(即E之前一共有pos个字符,除去符号位,小数点与小数点前一位共三位,剩下的pos-3位为小数部分的数字),如果右移位数等于小数点后数字的个数即pos-3=exp,表示小数点移至最后一位有效位后面,此时不需要输出小数点。
(如A=+3.1415E+004中,exp=4,pos=7,pos-3=exp,移动之后为31415,不需要输出小数点)
3)指数为0特判,字母E之前照原样输出
AC代码
//PAT_A 1073
#include<cstdio>
#include<cstring>
using namespace std;
int main() {
char str[10010];
(void)scanf("%s", &str);
int len = strlen(str);
if (str[0] == '-')printf("-");
int pos = 0;//存放E的位置
while (str[pos] != 'E') {//定位E的位置
pos++;
}
int exp = 0;
for (int i = pos + 2; i < len; i++) {
exp = exp * 10 + (str[i] - '0');
}//计算指数
if (exp == 0) {//指数为0 将exp前的照原样输出
for (int i = 1; i < pos; i++) {
printf("%c", str[i]);
}
}
if (str[pos + 1] == '-') {//指数为负,输出0.0000xxx,其中0的个数等于exp-2
printf("0.");
for (int i = 0; i < exp - 1; i++) {
printf("0");
}
printf("%c", str[1]);
for (int i = 3; i < pos; i++) {//跳过小数点
printf("%c", str[i]);
}
}
else {//指数为正
for (int i = 1; i < pos; i++) {//输出小数点移动之后的数
if (str[i] == '.')continue;
printf("%c", str[i]);
if (i == exp + 2 && pos - 3 != exp) {
//pos-3是从小数点到exp之间所有的数字,如果这些数字的小数点位数等于exp,
//则说明小数点移至最后一位,这种情况不需要输出小数点
printf(".");
}
}
for (int i = 0; i < exp - (pos - 3); i++) {
printf("0");
}
}
return 0;
}
来源:CSDN
作者:学姐你好高冷
链接:https://blog.csdn.net/weixin_44699689/article/details/104141474