[PAT-A 1073]Scientific Notation

橙三吉。 提交于 2020-02-02 10:05:41

在这里插入图片描述
题目大意:以科学计数法表示以一个实数A,按普通输出A,并保证所有有效位都保留,包括末尾的0。
思路:
1.以字符串方式读入给出的实数A,保存在数组str中。(编号从0开始)
2.str[0]为符号位,照原样输出。str[1]为A的第一位数字,str[2]中为小数点。
3.定位E的位置,记录在int型变量pos中,从str[1]开始遍历字符串,直到str[pos] == ‘E’。
4.计算指数。str[pos+1]为指数符号,保存。str[pos]+2至结尾为指数部分,转换为int型,保存为exp为指数绝对值。
5.输出:
1)如果指数为负,小数点应该前移,则输出形式为0.000…0xxxx,其中小数点后0的个数为(exp-1)个,后面xxx部分为字母E前所有数字。
2)如果指数为正,小数点应该后移,后移的位数为exp。原数中小数点在str[2],所以新小数点在str[exp+2]位置。
注意,字母E即pos位置与小数点位置之间的数字个数为pos-3(即E之前一共有pos个字符,除去符号位,小数点与小数点前一位共三位,剩下的pos-3位为小数部分的数字),如果右移位数等于小数点后数字的个数即pos-3=exp,表示小数点移至最后一位有效位后面,此时不需要输出小数点。
(如A=+3.1415E+004中,exp=4,pos=7,pos-3=exp,移动之后为31415,不需要输出小数点)
3)指数为0特判,字母E之前照原样输出

AC代码

//PAT_A 1073
#include<cstdio>
#include<cstring>
using namespace std;
int main() {
	char str[10010];
	(void)scanf("%s", &str);
	int len = strlen(str);
	if (str[0] == '-')printf("-");
	int pos = 0;//存放E的位置
	while (str[pos] != 'E') {//定位E的位置
		pos++;
	}
	int exp = 0;
	for (int i = pos + 2; i < len; i++) {
		exp = exp * 10 + (str[i] - '0');
	}//计算指数
	if (exp == 0) {//指数为0 将exp前的照原样输出
		for (int i = 1; i < pos; i++) {
			printf("%c", str[i]);
		}
	}
	if (str[pos + 1] == '-') {//指数为负,输出0.0000xxx,其中0的个数等于exp-2
		printf("0.");
		for (int i = 0; i < exp - 1; i++) {
			printf("0");
		}
		printf("%c", str[1]);
		for (int i = 3; i < pos; i++) {//跳过小数点
			printf("%c", str[i]);
		}
	}
	else {//指数为正
		for (int i = 1; i < pos; i++) {//输出小数点移动之后的数
			if (str[i] == '.')continue;
			printf("%c", str[i]);
			if (i == exp + 2 && pos - 3 != exp) {
				//pos-3是从小数点到exp之间所有的数字,如果这些数字的小数点位数等于exp,
				//则说明小数点移至最后一位,这种情况不需要输出小数点
				printf(".");
			}
		}
		for (int i = 0; i < exp - (pos - 3); i++) {
			printf("0");
		}
	}
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!