题意:首先浮点数部分必有1位小数,指数部分必为整数。其次要求保留所有有效位。
我将其拆分为2个字符串保存,左边的浮点数部分(去掉小数点)num,右边的指数部分exp。均包含符号。首先输出最前面的符号,为正不处理。n为exp的绝对值。然后根据指数的正负:若为负数,共计输出n个0。若为正数,区分为n>=valid_digit和n<valid_digit。前者无小数点,后者需要在适当的位置输出小数点。若为0,当然经过测试,测试数据中不含0指数,严谨起见还是加上,则原样输出。
//1024 科学计数法 (20分)
#include <cstdio>
char num[10000] = { 0 };
char exp[10000] = { 0 };
int main()
{
int i, j;
i = j = 0;
char ch;
while ((ch = getchar()) != 'E')
{
if (ch == '.') {
continue;
}
num[i++] = ch;
}
while ((ch = getchar()) != '\n')
{
exp[j++] = ch;
}
if (num[0] == '-')//最前面的符号部分
putchar('-');
int valid_digit = i - 2;//小数部分的有效位数是i-2
int n = 0;
sscanf(exp+1, "%d", &n);//将exp字符串转化为正整数
if (n) {
if (exp[0] == '+') {
if (n >= valid_digit) {//无小数点
printf("%s", num + 1);
int k = n - valid_digit;
while (k--)
{
putchar('0');
}
}
else//有小数点
{
i = 1;
while (num[i])
{
putchar(num[i]);
if (i == n + 1)//在该位置输出小数点
putchar('.');
i++;
}
}
}
else if (exp[0] == '-') {
printf("0.");
n--;//输出n-1个0
while (n--)
{
putchar('0');
}
printf("%s", num + 1);
}
}
else
{
printf("%c.%s", num[1], num + 2);
}
return 0;
}
来源:CSDN
作者:tangobravo
链接:https://blog.csdn.net/tangobravo/article/details/104011351