思路:由于数字过大,所以用数组存储,在全局变量里面声明,分情况讨论,确定小数点是往前移动还是往后移动,同时在像前或者后移动时又分为两种情况,即需不需要补0
代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
char s1[99999], s2[99999],c[99999];
int main()
{
scanf("%s", s1);
int i, j, flag1 = 1, flag2,posd,pose,k=0;//posd为记录小数点出现的位置,pose为记录E出现的位置
if (s1[0] == '-') flag1 = -1;
for (i = 1; i < strlen(s1); i++)
{
if (s1[i] == '.') posd = i-1;//因为第0个字符分开讨论了,所以这里小数点出现的位置要不连上第0个字符
else if (s1[i] == 'E') pose = i;
else if (s1[i] == '-') flag2 = -1;//用flag2来确定小数点是向前移动还是后移动
else if (s1[i] == '+') flag2 = 1;
}
for (i = 1; i < pose; i++)
if (s1[i] != '.') s2[k++] = s1[i];
s2[k] = '\0';//注意要在结尾加上结束符!
strcpy(c, s1 + (pose + 2));
int n = atoi(c);
if (flag1 == -1) printf("-");
if (flag2 == -1)
{
int m = n - posd;
if (m >= 0) {//需要补0的情况
printf("0.");
for (i = 0; i < m; i++) printf("0");
printf("%s", s2);
}
else {//不需要补0的情况
for (i = 0; i < posd - n; i++) printf("%c", s2[i]);
printf(".");
for (i = posd - n; i < strlen(s2); i++) printf("%c", s2[i]);
}
}
else
{
int m = n + posd;
if (m >= strlen(s2)) {//需要补0的情况
printf("%s", s2);
for (i = strlen(s2); i < m; i++) printf("0");
}
else {//不需要补0的情况
for (i = 0; i < m; i++) printf("%c", s2[i]);
printf(".");
for (i = m ; i < strlen(s2); i++) printf("%c", s2[i]);
}
}
return 0;
}