部分内容转载于:https://blog.csdn.net/tangxinru123/article/details/84975248
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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
以下为引用内容:
思路:首先把情况分为两大类:
1.指数小于0:例:-1.23E-3,转为普通数字:-0.00123,指数为3,则小数点后带2个0,规律如下:设指数为e,小数点后就有e-1个0。
2.指数大于等于0:这个又可以分成两个情况:
指数长度小于小数:例:+ 1.2345000E + 3,转为普通数字:1234.5000
指数长度大于小数:例:+ 1.23E + 3,转为普通数字:1230
这个在一个循环内就能解决:小数点后移e位,e位前如果没有数值就补0,e位后如果没有数值了就不加小数点了
提升自我:这个 scanf("%c%c.%[0-9]E%d",&h,&a[0],a+1,&e);是在百度上学会的,有关%[]的输入真的很牛。
输入是对其进行拆分,百度出来的极其巧妙的做法:
%[] 的意思是:读入此集合所限定的那些字符。例如 %[A-Z] 是指接受大写字母,一旦遇到非大写字母便停止接受,而 %[^] 是指不要读入此集合所限定的那些字符。例如 % [^A-Z] 是指不接受大写字母,一旦遇到大写字母便停止接受。
填坑日记:数组一定要设置大一点,我原先容量为10000,测试点5老是通不过,看了好几遍代码我觉得还是没啥问题,然后把数组改大一点,就对了。
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() 5 { 6 char h,a[10001]={0}; //注意这里和下面三元表达式哪里的0的区别 7 //这里字符数组初始化的0是数字0 8 //但在下面scanf中输入的0是字符'0' 9 //所以才能有下面的 a[i]==0?'0':a[i] 10 int i,e; 11 scanf("%c%c.%[0-9]E%d",&h,&a[0],a+1,&e); 12 if(h=='-') 13 printf("-"); 14 if(e<0) //指数小于0的情况 15 { 16 printf("0."); 17 e=-e-1; 18 while(e) 19 { 20 printf("0"); 21 e--; 22 } 23 printf("%s",a); 24 } 25 else //指数不小于0的情况 26 { 27 for(i=0;i<=e||a[i]!=0;i++) 28 { 29 if(i==e+1) 30 { 31 printf("."); 32 } 33 printf("%c",a[i]==0?'0':a[i]); 34 } 35 } 36 return 0; 37 }