题目
思路
- 拆分数据
首先使用sor[]数组将整个字符串录入,然后有
(1)使用tag1表示最前面的正负号,tag2表示指数的正负号;
(2)使用major数组录入第一个符号之后,‘E’之前的主体部分,并且顺带求出主体部分的小数位数n1;
(3)使用index算出指数的大小 - 打印数据
(1)tag1==‘-’时打印
(2)index为0时单独处理,直接把major数组整个打出即可;
(3)tag2==‘-’时,先打印一个“0.”,再打印index-1个0,再打印major数组中不为‘.’的部分
(4)tag2==‘+’时,再判断index和n1的关系
(5)若index>=n1,先打印major数组中不为’.‘的部分,再打印index-n1个0;
(6)若index<n1,先打印major数组中index+1位数字(‘.’跳过),再打印一个小数点’.’,再打印major数组中剩余部分即可
该题有更简单的打印方法,打总体思路无疑都是切割得到各种数据后再各种情况下打印即可
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i, n1, count, index = 0;
char sor[10000];
scanf("%s", sor);
char tag1 = sor[0];
char major[10000];
for (i = 1; sor[i] != 'E'; i++)
major[i] = sor[i];
major[i] = '\0';
n1 = i - 3;
char tag2 = sor[i + 1];
for (i = i + 2; sor[i] != '\0'; i++)
index = 10 * index + (sor[i] - '0');
if (tag1 == '-')
printf("%c", tag1);
if (index != 0)
{
if (tag2 == '+')
{
if (index >= n1)
{
for (i = 1; major[i] != '\0'; i++)
if (major[i] != '.')
printf("%c", major[i]);
for (i = 0; i < index - n1 ; i++)
printf("0");
}
else
{
for (i = 1, count = 0; count < index + 1; i++)
if (major[i] != '.')
{
printf("%c", major[i]);
count++;
}
printf(".");
for (; major[i] != '\0'; i++)
printf("%c", major[i]);
}
}
else
{
printf("0.");
for (i = 0; i < index - 1; i++)
printf("0");
for (i = 1; major[i] != '\0'; i++)
if (major[i] != '.')
printf("%c", major[i]);
}
}
else
for (i = 1; major[i] != '\0'; i++)
printf("%c", major[i]);
return 0;
}