🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# [TOC] ## 题目描述 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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> int main() { //输入 char N[9999]; int i,p,e=0; scanf("%s",&N); //计算和输出 p=strchr(N,'E')-N+2;/*strchr(N,'E')-N+1为E的下标,再后面2 位即使指数部分去掉符号的开始坐标*/ for(i=p;i<strlen(N);i++) { e=e*10+N[i]-'0'; } if(N[p-1]=='-') { e*=-1; } *strchr(N,'E')='\0';/*指数的信息已经得到,将E开始的指数部 分截断*/ if(N[0]=='-') { printf("-"); } if(e<0)/*小数点往前移,需要在前面加0*/ { e*=-1; printf("0."); for(i=1;i<e;i++) { printf("0"); } for(i=1;i<strlen(N);i++) { if(N[i]!='.') { printf("%c",N[i]); } } }else if(e<(strlen(N)-3))/*小数点往后移动,且在数字部分中 间*/ { for(i=1;i<strlen(N);i++) { if(N[i]!='.') { printf("%c",N[i]); } if(i==e+2) { printf("."); } } }else/*小数点在后面,不用打印'.',需要在后面加0*/ { for(i=1;i<strlen(N);i++) { if(N[i]!='.') { printf("%c",N[i]); } } for(i=0;i<e-strlen(N)+3;i++) { printf("0"); } } return 0; } ```