1024 科学计数法(C语言详解)

前言

这个题目要考虑挺多小细节的(不过比起福尔摩斯那道还是hhh),我尽力了。。。

正文

题目

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][1-9].[0-9]+E[±][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入格式:
每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999
输出格式:
对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0
输入样例 1:
+1.23400E-03
输出样例 1:
0.00123400
输入样例 2:
-1.2E+10
输出样例 2:
-12000000000

代码

#include 
#include
#define MAX 1000
int main(){
	char s[MAX];
	int flag=1,num[MAX];//指数符号和数组 
	int i,len=0,exp=0; 
	int j=0,n;
	int iBegin=0,iEnd=0;//指数位起点和终点
	scanf("%s",s);
	n=strlen(s);//字符串长度 
	if(s[0]=='-') //整数前的负号
	  printf("-");//是符号就直接输出
	for(i=1;s[i]!='E';i++){ 
		if(s[i]!='.'){
		    num[j++]=s[i]-'0';//存储E前的数字进入数组 
			len++;//数组长度
		} 
	}
	if(s[i+1]=='-'){// E后的符号,指数的正负 
		flag=-flag;
	} 
	iBegin=i+2;//指数的第一位 
	iEnd=iBegin;
	for(iEnd;iEnd<n;iEnd++){
		exp=exp*10+(s[iEnd]-'0');//存放指数 
	}
    /*第一种情况如果指数是0*/
	if(exp==0){ 
		for(j=0;j<len;j++)
		  printf("%d",num[j]);//输出数组 
	}
    /*第二种情况如果指数是负数*/
	if(flag==-1){
	   printf("0.");
	   while(exp-1){
	   	 printf("0");
	   	 exp--;
	   }
	    for(j=0;j<len;j++)
		  printf("%d",num[j]);//输出数组 
	} 
    /*第三种情况如果指数是正数*/
	else if(flag==1){
	    if(exp<len-1) //第三种情况里的第一种情况:如果指数小于数组
		{
			for(j=0;j<len;j++){
				printf("%d",num[j]);
				if(j==exp){
					printf(".");//输出小数点 
				}
			}
		} 
		else if(exp>=len-1){//第三种情况里的第二种情况:如果指数大于等于数组
			for(j=0;j<len;j++){
				printf("%d",num[j]);
			}
			while(exp-len+1){
				printf("0");
				exp--;
			}
		}   
	} 
}

你可能感兴趣的:(PTA题集,c语言)