1024 科学计数法
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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 #include<stdio.h>
2 #include<math.h>
3 #include<string.h>
4 #include<stdlib.h>
5 int main()
6 {
7 char num[10001];
8 gets(num);
9 int len=strlen(num);
10 char num1[len],num2[len];
11 (num[0]=='+')?(printf("")):(printf("-"));
12 int qian=0,hou=0,yi=0,t; //qian小数点前位数,hou小数点后位数,sum包括小数点总位数,t为标记
13 for(int i=1;i<len;i++)
14 {
15
16 if(num[i]!='.')
17 num1[qian++]=num[i];
18 else
19 {
20 num1[qian]='\0';
21 t=i+1;
22 break;
23 }
24 }
25 for(int i=t;i<len;i++)
26 {
27 if(num[i]!='E')
28 num2[hou++]=num[i];
29 else
30 {
31 num2[hou]='\0';
32 t=i+1;
33 break;
34 }
35 }
36 int flag=0;//flag=0指数为负,往前移
37 if(num[t]=='+')
38 flag=1;//flag=1指数为正,往后移
39 for(int i=len-1;i>=t+1;i--)
40 {
41 yi=yi+(num[i]-'0')*pow(10,len-1-i);//yi移动的格数
42 }
43 if(flag==1)//往后移
44 {
45 printf("%s",num1);
46 if(yi>=hou)
47 {
48 printf("%s",num2);
49 for(int i=0;i<yi-hou;i++)
50 printf("0");
51 }
52 else if(yi<hou)
53 {
54 int i;
55 for(i=0;i<yi;i++)
56 printf("%c",num2[i]);
57 printf(".");
58 for(int j=i;j<hou;j++)
59 printf("%c",num2[j]);
60 }
61 }
62 else if(flag==0)//往前移
63 {
64 if(yi>=qian)
65 {
66 printf("0.");
67 for(int i=0;i<yi-1;i++)
68 printf("0");
69 printf("%s%s",num1,num2);
70 }
71 else if(yi<qian)
72 {
73 int i;
74 for(i=0;i<qian-yi;i++)
75 printf("%c",num1[i]);
76 printf(".");
77 for(int j=i;j<qian;j++)
78 printf("%c",num1[i]);
79 printf("%s",num2);
80 }
81 }
82 return 0;
83 }
大佬见笑,,