PAT 乙等 1024 科学记数法 C语言
2017-05-08 22:03
85 查看
1024. 科学计数法 (20)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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.在输入中找到E,将之后的指数截取出来
3.判断指数是正数还是负数:
(1)若指数为负数,则根据指数大小在底数之前输出对应个数的0,输出完0后再输出底数,记得跳过底数中的小数点;若为-0。则直接输出底数
(2)若指数为正数,若指数小于底数中小数点后的位数,若是则将小数点右移指数位,之后再输出剩余的底数。若指数大于底数中小数点后的位数,则
在输出完底数后在输出剩余的0;若指数为+0,则直接输出底数
一、起始变量
1.num【10000】接受字符串
2.e_mark,用于记录输入字符串中E的位置,以此来区分指数和底数
3.index_flag,用于记录指数的符号位
4.index_ch,用于记录指数字符串
5.index,用于记录将index_ch转换的指数的整数形式
二、代码
#include "stdio.h" #include "math.h" #include "string.h" int main() { char num[10000]; scanf("%s",num); int i; //若为负,直接打印符号; if(num[0] == '-') { printf("-"); } //找到E的下标,用于分割底数和指数 int e_mark; for(i = 1; i < strlen(num); i++) { if(num[i] == 'E') { e_mark = i; break; } }//此循环结束后,下表位于E的位置 i++;//将下标移动到指数的符号位 //记录指数符号位 char index_flag = num[i]; //获得指数字符串 char index_ch[5];//指数最多有4位,增加一位存储\0 int j = 0; for(i = i + 1; i < strlen(num); i++)//初始化为i+1,即将i移动到指数的第一位数字 { index_ch[j] = num[i]; j++; } //将指数字符串转换为整形指数 int index = 0; //初始指数权重,即为指数长度减一,比如指数为1234,则1权重为为10的(4-1)次方 int index_right = strlen(index_ch) - 1; for(i = 0; i < strlen(index_ch); i++) { index += (index_ch[i] - '0') * pow(10,index_right); index_right--; }//至此已经计算完指数 if(index_flag == '-')//讨论指数为-的时候 { if(index != 0) { printf("0.");//只要指数小于0,就会产生‘0.’ for(i = 0; i < index - 1; i++)//因为已经输出“0.”了,故少输出一个零 { printf("0"); } for(i = 1; i < e_mark; i++)//输出num中的底数,从1开始,0位为底数的符号位,已经在刚开始输出过 { if(i == 2)//跳过科学记数法的小数点 { continue; } printf("%c",num[i]); } } else if(index == 0)//指数为0 { for(i = 1; i < e_mark; i++)//输出num中的内容 { printf("%c",num[i]); } } } else if(index_flag == '+') { if(index != 0) { if(index < e_mark - 3)//指数小于小数点后底数的位数 { for(i = 1; i < e_mark ; i++) { if(i == 2)//跳过小数点 { continue; } else if(i == 2 + index)//在指数为0的位置输出小数点 { printf("%c",num[i]); printf("."); } else { printf("%c",num[i]); } } } else if(index == e_mark - 3) //指数等于小数点后底数位数 { for(i = 1; i < e_mark ; i++) { if(i == 2)//跳过小数点 { continue; } else { printf("%c",num[i]); } } } else if(index > e_mark - 3)//指数大于小数点后底数位数 { for(i = 1; i < e_mark; i++) { if(i == 2)//跳过底数小数点 { continue; } else { printf("%c",num[i]); } } //因为指数大于小数点之后的底数位数,在输出完底数后要再输出0 for(i = 0; i < index - (e_mark - 3); i++) { printf("0"); } } } else if(index == 0)//指数为0 { for(i = 1; i < e_mark; i++)//输出num中的内容 { printf("%c",num[i]); } } } return 0; }
相关文章推荐
- PAT (Basic Level) Practise (中文)1024. 科学计数法 (20) C语言
- PAT Basic 1024. 科学计数法 (20)(C语言实现)
- PAT考试乙级1024(C语言实现)重点题目
- PAT乙级 1024. 科学计数法 (C语言)
- PAT乙级1024 科学记数法
- PAT乙级1024(C语言)-科学计数法 (20)
- PAT 乙等 1016 C语言
- PAT (Basic Level) Practise (中文)1020. 月饼 (25) C语言
- PAT 乙等 1018 C语言
- PAT (Basic Level) Practise (中文)1023. 组个最小数 (20)C语言
- PAT (Basic Level) Practise (中文)1026. 程序运行时间(15) C语言
- PAT (Basic Level) Practise (中文)1028. 人口普查(20)C语言
- PAT (Basic Level) Practise (中文)1034. 有理数四则运算(20) C语言
- pat 1024 Palindromic Number
- PAT-1024 Palindromic Number (25)
- PAT 数字分类 C语言版本
- PAT Basic 1003. 我要通过!(20)(C语言实现)
- PAT Basic 1018. 锤子剪刀布 (20)(C语言实现)
- PAT Basic 1033. 旧键盘打字(20)(C语言实现)
- PAT Basic 1050. 螺旋矩阵(25)(C语言实现)