前言
这个题目要考虑挺多小细节的(不过比起福尔摩斯那道还是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 <stdio.h>
#include<string.h>
#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--;
}
}
}
}