【问题描述】
编写程序,输入一个数字字符串s,将它转换为科学计数法输出。
* 数字串s仅包含数字和小数点(也就是不会输入负数),小数点位于最后时,小数点可有可无;小数点前只有0时, 0可有可无。字符串s长度<500。
* 科学计数法应保持原数字的有效精度,例如 10.0 = 1.00E+1;科学计数法的指数部分用E表示,不缺省; E后用一位表示指数的符号位,不缺省,0的符号位记为正。
* 要求编写函数,通过字符串的操作来完成转换,不能直接使用printf的格式化输出。
【输入形式】数字字符串
【输出形式】该数字对应的科学记数法表示
【样例输入1】
100.324
【样例输出1】
1.00324E+2
【样例输入2】
.00027
【样例输出2】
2.7E-4
#include<stdio.h>
#include<string.h>
#define MAX 500
int main()
{
int num[500], zero[500];/*输入输出数组num,0计数数组zero*/
int str_begin, str_end, len = 0, sum = 0, end = 0, sum_0 = 0, flag = 1;
/*输入字符串记录变量str_begin,str_end,len,
小数点前0计数变量sum,无用0结束位置end
字符串中0计数变量sum_0*/
char s[500];/*输入输入数组s*/
int i, j = 0, k, a, b, c, d=0, t, n, m, total;/*输入循环辅助变量*/
scanf ("%s", s);
n = strlen(s);/*字符串长度*/
for (i=0; i < n && s[i] != '.'; i++)
{
num[j++] = s[i] - '0';/*存储.前的数字进入数组 */
len++;/*数组长度*/
}
for (total = 0; total <= n; total++)
{
if (s[total] == '.' || s[total] == '\0')
s[total] = '0';
zero[total] = s[total] - '0';
sum_0 += zero[total];
}/*判断数组中是否全为0*/
str_begin = i + 1;
str_end = n - 1;
for (t = 0; t < i; t++)
sum = sum + num[t];/*小判断数点前是否全为0*/
if ( (i ==0 && sum_0 != 0) || (sum == 0 && sum_0 != 0) )
flag = -flag;/*区分正负与0*/
if (len == n)/*无小数点*/
{
printf ("%d", num[0]);
if (n > 1)
printf ("."); /*超过两位用'.'*/
for (b = 1; b < i; b++)
printf("%d", num[b]);/*输出数组*/
if (sum_0 == 0)
printf("E+0");/*0时*/
else
printf("E+%d",len-1);/*非0时*/
}
else if (len != n)/*有小数点*/
{
if (flag == 1) /*正数*/
{
for (k = str_begin; k <= str_end; k++)
{
num[j++] = s[k] - '0';
}
printf ("%d", num[0]);
if (n > 1)
printf ("."); /*超过两位用'.'*/
for (c = 1; c <= n - 2; c++)
printf ("%d", num[c]); /*输出数组*/
if (sum_0 == 0)
printf ("0E+0");/*0时*/
else
printf ("E+%d",len-1);/*非0时*/
}
else if (flag == -1)/*负数*/
{
for (a = str_begin; a <= str_end; a++)
{
num[j++] = s[a] - '0';/*读入.之后数字*/
}
for (m = 0; m <= n - 2; m++)
{
end = end + num[m];/*确定无用0结束位置 */
if (end == 0)
d++;
else if (end != 0)
{
printf ("%d", num[m]);
if (m == d && n - d - 2 > 0)
printf (".");/*在第一个非0数之后,若有两位,输出.*/
}
}
for ( j = m + 1; j < n; j++)
printf ("%d", num[j]);/*输出数组*/
printf ("E-%d", d - len + 1);
}
}
return 0;
}