1024 科学计数法 (20分)

在这里插入图片描述
在这里插入图片描述
思路:由于数字过大,所以用数组存储,在全局变量里面声明,分情况讨论,确定小数点是往前移动还是往后移动,同时在像前或者后移动时又分为两种情况,即需不需要补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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值