1024 科学计数法

部分内容转载于: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  } 
原文地址:https://www.cnblogs.com/oaoa/p/11263381.html