PAT 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 /*
  2  * main.c
  3  *
  4  *  Created on: 2016年7月3日
  5  *      Author: Will
  6  */
  7
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #include <string.h>
 11
 12 struct S_Num
 13 {
 14     unsigned int flag1;
 15     char base1;
 16     char base2[10000];
 17     unsigned int base2_cnt;
 18     unsigned int flag2;
 19     unsigned int exp_index;
 20 };
 21
 22 int main(void)
 23 {
 24     char str[10020] = {0};
 25     unsigned int i, j;
 26     char exp[5];
 27     struct S_Num num1;
 28     char num[10020] = {0};
 29
 30     scanf("%s", str);
 31
 32     if(str[0] == ‘+‘)
 33         num1.flag1 = 0;
 34     else
 35         num1.flag1 = 1;
 36
 37     num1.base1 = str[1];
 38
 39     for(i = 3; i < sizeof(str); i++)
 40     {
 41         if(str[i] == ‘E‘)
 42             break;
 43         else
 44             num1.base2[i - 3] = str[i];
 45     }
 46
 47     num1.base2_cnt = i - 3;
 48
 49     if(str[i + 1] == ‘+‘)
 50         num1.flag2 = 0;
 51     else
 52         num1.flag2 = 1;
 53
 54     for(j = i + 2; j < sizeof(str); j++)
 55     {
 56         if(str[j] == ‘\0‘)
 57             break;
 58         else
 59             exp[j - i - 2] = str[j];
 60     }
 61
 62     num1.exp_index = atoi(exp);
 63
 64     /* 指数为正 */
 65     if(num1.flag2 == 0)
 66     {
 67         num[0] = num1.base1;
 68
 69         /* 指数小于小数点后有效位数 */
 70         if(num1.exp_index < num1.base2_cnt)
 71         {
 72             for(i = 0; i < num1.exp_index; i++)
 73             {
 74                 num[i + 1] = num1.base2[i];
 75             }
 76
 77             num[i + 1] = ‘.‘;
 78
 79             for(j = num1.exp_index; j < num1.base2_cnt; j++)
 80             {
 81                 num[i + 2 + j - num1.exp_index] = num1.base2[j];
 82             }
 83         }
 84         /* 指数大于等于小数点后有效位数 */
 85         else
 86         {
 87             for(i = 0; i < num1.base2_cnt; i++)
 88                 num[i + 1] = num1.base2[i];
 89
 90             for(j = 0; j < num1.exp_index - num1.base2_cnt; j++)
 91                 num[i + 1 + j] = ‘0‘;
 92         }
 93     }
 94     /* 指数为负 */
 95     else
 96     {
 97         if(num1.exp_index >= 1)
 98         {
 99             num[0] = ‘0‘;
100             num[1] = ‘.‘;
101
102             for(i = 0; i < num1.exp_index - 1; i++)
103                 num[i + 2] = ‘0‘;
104
105             num[num1.exp_index + 1] = num1.base1;
106
107             for(j = 0; j < num1.base2_cnt; j++)
108             {
109                 num[num1.exp_index + 2 + j] = num1.base2[j];
110             }
111         }
112         else
113         {
114             num[0] = num1.base1;
115             num[1] = ‘.‘;
116
117             for(j = 0; j < num1.base2_cnt; j++)
118             {
119                 num[num1.exp_index + 2 + j] = num1.base2[j];
120             }
121         }
122     }
123
124     if(num1.flag1 == 1)
125         printf("-");
126
127     printf("%s", num);
128
129     return 0;
130 }
131
132 /* END OF FILE */

-------------------------------------------------------------------------------------------------------------------------------------------------------

这里数字存储长度不超过9999个字节,9999个字节可以存储多大的数?

1个字节可以存储2^8-1 = 127

9999个字节可以存储2^(8*9999)-1 数字用十进制表示长度为21070位,所以数组的大小不够存储。修改后测试通过。

  1 /*
  2  * main.c
  3  *
  4  *  Created on: 2016年7月3日
  5  *      Author: Will
  6  */
  7
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #include <string.h>
 11
 12 struct S_Num
 13 {
 14   unsigned int flag1;
 15   char base1;
 16   char base2[22000];
 17   unsigned int base2_cnt;
 18   unsigned int flag2;
 19   unsigned int exp_index;
 20 };
 21
 22 int main(void)
 23 {
 24   char str[22000] = {0};
 25   unsigned long i, j;
 26   char exp[5];
 27   struct S_Num num1;
 28   char num[22000] = {0};
 29
 30   scanf("%s", str);
 31
 32   if(str[0] == ‘+‘)
 33     num1.flag1 = 0;
 34   else
 35     num1.flag1 = 1;
 36
 37   num1.base1 = str[1];
 38
 39   for(i = 3; i < sizeof(str); i++)
 40   {
 41     if(str[i] == ‘E‘)
 42       break;
 43     else
 44       num1.base2[i - 3] = str[i];
 45   }
 46
 47   num1.base2_cnt = i - 3;
 48
 49   if(str[i + 1] == ‘+‘)
 50     num1.flag2 = 0;
 51   else
 52     num1.flag2 = 1;
 53
 54   for(j = i + 2; j < sizeof(str); j++)
 55   {
 56     if(str[j] == ‘\0‘)
 57       break;
 58     else
 59       exp[j - i - 2] = str[j];
 60   }
 61
 62   num1.exp_index = atoi(exp);
 63
 64   /* 指数为正 */
 65   if(num1.flag2 == 0)
 66   {
 67     num[0] = num1.base1;
 68
 69     /* 指数小于小数点后有效位数 */
 70     if(num1.exp_index < num1.base2_cnt)
 71     {
 72       for(i = 0; i < num1.exp_index; i++)
 73       {
 74         num[i + 1] = num1.base2[i];
 75       }
 76
 77       num[i + 1] = ‘.‘;
 78
 79       for(j = num1.exp_index; j < num1.base2_cnt; j++)
 80       {
 81         num[i + 2 + j - num1.exp_index] = num1.base2[j];
 82       }
 83     }
 84     /* 指数大于小数点后有效位数 */
 85     else
 86     {
 87       for(i = 0; i < num1.base2_cnt; i++)
 88         num[i + 1] = num1.base2[i];
 89
 90       for(j = 0; j < num1.exp_index - num1.base2_cnt; j++)
 91         num[i + 1 + j] = ‘0‘;
 92     }
 93   }
 94   /* 指数为负 */
 95   else
 96   {
 97     if(num1.exp_index == 0)
 98     {
 99       num[0] = num1.base1;
100       num[1] = ‘.‘;
101
102       for(j = 0; j < num1.base2_cnt; j++)
103       {
104         num[2 + j] = num1.base2[j];
105       }
106     }
107     else
108     {
109       num[0] = ‘0‘;
110       num[1] = ‘.‘;
111
112       for(i = 0; i < num1.exp_index - 1; i++)
113         num[i + 2] = ‘0‘;
114
115       num[num1.exp_index + 1] = num1.base1;
116
117       for(j = 0; j < num1.base2_cnt; j++)
118       {
119         num[num1.exp_index + 2 + j] = num1.base2[j];
120       }
121     }
122   }
123
124   if(num1.flag1 >= 1)
125     printf("-");
126
127   printf("%s", num);
128
129   return 0;
130 }
131
132 /* END OF FILE */

时间: 2024-08-28 12:35:48

PAT 1024 科学计数法 段错误的相关文章

PAT 1024. 科学计数法 (20)

1024. 科学计数法 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出. 现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位

PAT——1024. 科学计数法

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出. 现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留. 输入格式: 每个输入包含1个测试用例,即一个以科学计数法表示的实数A.该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999. 输出格式: 对每个测

PAT 1024 科学计数法 (字符串)

不用纠结怎么把输入串变成结果串,一部分一部分输出即可.(时间不够写一部分是一部分,+的情况10分-的情况6分,还漏了4分有空来讨论一下) 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=10010; 4 int main(){ 5 char a[maxn]; 6 scanf("%s",a); 7 if(a[0]=='-') printf("-"); 8 int len=s

PAT乙级 1024. 科学计数法 (20)

1024. 科学计数法 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出. 现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位

PAT-乙级-1024. 科学计数法 (20)

1024. 科学计数法 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出. 现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位

1024. 科学计数法(两点未通过)

题目截图: 思路: 字符串处理.根据指数正负做不同处理. 代码: /* 1024. 科学计数法 */ #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <time.h> #define maxn 10010 char str[maxn]; // 存储输入值 int main() { // a为整数部分 // b为E位置,c为指

1024 科学计数法 (20)(20 分)

1024 科学计数法 (20)(20 分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出. 现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留. 输入格式: 每个输入包含1个测试用例,即一个以科学计数法表示的实数A.该数字的存储长度不超过9999字节,且其指数的

P 1024 科学计数法

转跳点:?? 1024 科学计数法 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出. 现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留. 输入格式: 每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A.该数字的存储长度不超过 9999 字节,且其指数

PAT乙级—1024. 科学计数法 (20)-native

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出. 现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留. 输入格式: 每个输入包含1个测试用例,即一个以科学计数法表示的实数A.该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999. 输出格式: 对每个测