大一C语言总结贴(持更) Part 12 科学记数法

【问题描述】

编写程序,输入一个数字字符串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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值