1024.科学计数法
2018-08-02 本文已影响4人
yzbkaka
题目描述
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。
输入描述
每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。
输出描述
对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。
输入例子
+1.23400E-03
输出例子
0.00123400
我的代码
//代码不是满分
#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
char a[9999];
int i,j,len,b;
double sum;
scanf("%s",a);
len=strlen(a);
sum=a[1]-'0';
if(a[0]=='+'){
if(a[len-3]=='-'){
b=(a[len-1]-'0')+(a[len-2]-'0')*10;
printf("0.");
for(i=0;i<b-1;i++){
printf("0");
}
printf("%c",a[1]);
for(i=3;a[i]!='E';i++){
printf("%c",a[i]);
}
}
if(a[len-3]=='+'){
b=(a[len-1]-'0')+(a[len-2]-'0')*10;
printf("%c",a[1]);
if(b<=len-7){
for(i=3;i<3+b;i++){
printf("%c",a[i]);
}
printf(".");
for(i;a[i]!='E';i++){
printf("%c",a[i]);
}
}
if(b>len-7){
for(i=3,j=0;a[i]!='E';i++){
printf("%c",a[i]);
j++;
}
for(i=0;i<b-j;i++){
printf("0");
}
}
}
}
if(a[0]=='-'){
if(a[len-3]=='-'){
printf("-");
b=(a[len-1]-'0')+(a[len-2]-'0')*10;
printf("0.");
for(i=0;i<b-1;i++){
printf("0");
}
printf("%c",a[1]);
for(i=3;a[i]!='E';i++){
printf("%c",a[i]);
}
}
if(a[len-3]=='+'){
printf("-");
b=(a[len-1]-'0')+(a[len-2]-'0')*10;
printf("%c",a[1]);
if(b<=len-7){
for(i=3;i<3+b;i++){
printf("%c",a[i]);
}
printf(".");
for(i;a[i]!='E';i++){
printf("%c",a[i]);
}
}
if(b>len-7){
for(i=3,j=0;a[i]!='E';i++){
printf("%c",a[i]);
j++;
}
for(i=0;i<b-j;i++){
printf("0");
}
}
}
}
return 0;
}
我的分析
其实我对这道题的思路比较简单,就是对输入的一串字符进行判断,然后再分情况进行输出,但是我写的代码的局限性就是只能够正确判断指数在100以内的运算,一旦超过100就要分情况对代码进行大范围的修改,很耗时间,所以就不继续修改下去。
其实这道题毫无算法可言,在考试的时候就是拼的耐心,虽然我这道题只得了14分,在短时间内能够正确通过三个范例,在紧张的时间内也还是很划得来的。
正确代码
//别人的满分代码
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
int i = 0;
while (s[i] != 'E') i++;
string t = s.substr(1, i-1);
int n = stoi(s.substr(i+1));
if (s[0] == '-') cout << "-";
if (n < 0) {
cout << "0.";
for (int j = 0; j < abs(n) - 1; j++) cout << '0';
for (int j = 0; j < t.length(); j++)
if (t[j] != '.') cout << t[j];
} else {
cout << t[0];
int cnt, j;
for (j = 2, cnt = 0; j < t.length() && cnt < n; j++, cnt++) cout << t[j];
if (j == t.length()) {
for (int k = 0; k < n - cnt; k++) cout << '0';
} else {
cout << '.';
for (int k = j; k < t.length(); k++) cout << t[k];
}
}
return 0;
}