您的位置:首页 > 其它

1024. 科学计数法 (20)

2015-10-07 20:05 399 查看
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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
Aden:这是一题很典型的字符串处理题,但我对字符串真的不擅长。
#include "sstream"#include "iostream"#include "string"using namespace std;
int main(){string str, num;int exp;cin >> str;char sign = str[0]; //第一个符号位int Loc = str.find('E');num = str[1];num += str.substr(3, Loc-3 );//得到数字部分的内容,其中第二个参数代表字串的长度string s = str.substr(Loc + 1);stringstream stream;stream << s;stream >> exp;//开始输出if (sign == '-')cout << "-";if (exp < 0)  //指数为负数,前面加0{cout << "0.";for (int i = 0; i < -exp - 1; ++i)cout << '0';cout << num;}else if (exp>=num.length() - 1)//指数比有效数字的位数大,后追加0,没小数点{cout << num;for (int i = 0; i < exp - num.length() + 1; i++){cout << '0';}}else{cout << num.substr(0,exp+1);cout << '.';cout << num.substr(exp + 1);}return 0;}
#include "sstream"#include "iostream"#include "string"using namespace std;int main(){string s;stringstream stream;int n;       //保存指数cin >> s;string::size_type pos = s.find('E');string s2 = s.substr(pos + 2); //通过stringstream将string转化成intstream << s2;stream >> n;if (s[pos + 1] == '-')        //判断指数的符号{if (s[0] == '-')          //输出负号,正好默认不必输出cout << s[0];for (int i = 0; i < n; i++){if (i == 1)cout << ".0";    //指数为负,前面补0.其中第一个0之后是小数点.elsecout << "0";}cout << s[1];//补0后输出原来的有效数字,因为一开始输入的字符串前两个字符为数字和小数点//数字上一步已经输出,小数点不用输出,所以i从第4个字符开始输出for (int i = 3; i < pos; i++)cout << s[i];cout << endl;}else  //指数为正,分为两种情况。1.指数比有效数字位数大,需要末尾加0 ;2. 不需要末尾加0,但需要小数点在中间{if (n >= pos - 3)    //情况1{if (s[0] == '-')cout << s[0] << s[1];elsecout << s[1];for (int i = 3; i < pos; i++)cout << s[i];for (int i = 0; i < n - (pos - 3); i++)cout << "0";cout << endl;}else                //情况2{if (s[0] == '-')cout << s[0] << s[1];elsecout << s[1];for (int i = 3; i < 3 + n; i++)cout << s[i];cout << ".";for (int i = 3 + n; i < pos; i++)cout << s[i];cout << endl;}}return 0;}
#include <cstdio>#include <sstream>#include <cstring>using namespace std;char sign,ch,dir,zheng[10001],xiao[10001];int a,ex;stringstream strin;void solve_0(){printf("%d.",a);printf("%s\n",zheng);}void solve_1(){int i;printf("0.");for(i=0;i<ex-1;++i){printf("0");}printf("%d",a);printf("%s\n",zheng);}void solve_2(){int i,len;len = strlen(zheng);printf("%d",a);if(len<=ex){printf("%s",zheng);for(i=0;i<ex-len;++i)printf("0");printf("\n");}else{for(i=0;i<ex;++i){printf("%c",zheng[i]);}printf(".");printf("%s\n",zheng+ex);}}int main(){scanf("%c%d.%[^E]%c%c%s",&sign,&a,zheng,&ch,&dir,xiao);//printf("%c  %d %s  %c  %c  %s\n",sign,a,zheng,ch,dir,xiao);if(sign=='-')printf("-");strin<<xiao;strin>>ex;if(ex==0){solve_0();return 0;}if(dir=='-'){solve_1();}else{solve_2();}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: