PAT 1024 科学计数法 段错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 */
以上是关于PAT 1024 科学计数法 段错误的主要内容,如果未能解决你的问题,请参考以下文章