科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].
[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数?A,请编写程序按普通数字表示法输出?A,并保证所有有效位都被保留。
每个输入包含 1 个测试用例,即一个以科学计数法表示的实数?A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。
对每个测试用例,在一行中按普通数字表示法输出?A,并保证所有有效位都被保留,包括末尾的 0。
+1.23400E-03
0.00123400
-1.2E+10
-12000000000
?做了这么多PAT题目,我觉得做PAT的题目最简单的方法就是你将你的数学思想照猫画虎利用代码编写出来的正确率是最高的。
?脑子里面怎么想的我就用代码怎么编,我们没有那特别好的编程能力,那我们就别用那些高超的编程技巧,我们就按部就班一步一步将我们脑子里面想的编写出来就行了。
这也是我对于我的要求。
?我们来看这道题目:
科学计数法分为5个部分:
①尾数数符? ②尾数部分? ③'E'? ④指数数符? ⑤指数部分
这就是我们科学计数法表示的形式。
那这样也就要告诉我们,做这种题目需要分条件,每个条件都要考虑进去。
下面就是我的编写代码,虽然看着很多,但是我就是将我怎么想的挨个编写出来,你如果可以紧跟我的思路,一定是可以看懂的。
//完整代码
#include <iostream>
#include <string>
using namespace std;
int main() {
string kexue = "";
cin >> kexue;
char wei_shu[10001]; //存储尾数符号以及尾数部分
int count1 = 0; //尾数计数
char zhi_shu[10001]; //存储指数符号以及指数部分
int count2 = 0; //指数计数
for (int i = 0; i < kexue.length(); i++) {
if (kexue[i] == 'E') {
for (int j = 0; j < i; j++) {
wei_shu[count1++] = kexue[j];
}
for (int m = i + 1; m < kexue.length(); m++) {
zhi_shu[count2++] = kexue[m];
}
break;
}
}
//计算指数的值
string ex;
for(int i=1;i<count2;i++){
ex[i-1]=zhi_shu[i];
}
int exponent=stoi(ex); //指数值
//如果是负数先输出一个负号
if(wei_shu[0]=='-'){
cout<<'-';
}
//如果指数是正,则小数点往后移动;指数是负数小数点往前移动
if(zhi_shu[0]=='+'){
cout<<wei_shu[1];
if(count1-3<=exponent){//指数超出尾数范围,后面补0
for(int i=3;i<count1;i++){
cout<<wei_shu[i];
}
for(int j=0;j<exponent+3-count1;j++){ //补齐0
cout<<'0';
}
}
else {
for(int i=3;i<exponent+3;i++){
cout<<wei_shu[i];
}
cout<<'.'; //输出小数点
for(int j=exponent+3;j<count1;j++){
cout<<wei_shu[j];
}
}
}
else {
if(exponent==0){ //先判断指数为负,指数值为0的情况
for(int i=1;i<count1;i++){
cout<<wei_shu[i];
}
}
else {
cout<<"0."; //首先输出0.
for(int i=0;i<exponent-1;i++){ //在前面补exponent-1个0
cout<<'0';
}
cout<<wei_shu[1];
for(int j=3;j<count1;j++){
cout<<wei_shu[j];
}
}
}
return 0;
}
?1.变量的定义与输入:
string kexue = "";? ? ? ? ? ? ?//我们输入的科学计数法形式
cin >> kexue;? ? ? ? ? ? ? ? ? ?//输入
char wei_shu[10001];? ? ? ?//存储尾数符号以及尾数部分
int count1 = 0;? ? ? ? ? ? ? ? ? //尾数计数
char zhi_shu[10001];? ? ? ? //存储指数符号以及指数部分
int count2 = 0;? ? ? ? ? ? ? ? ? ? //指数计数
?2.分尾数与指数:
我们输入的是一个科学计数法形式,那尾数和指数是混在一起的,所以我们要将他们分开来,分割的标准就是’E‘左边是尾数部分,’E‘右边是指数部分。
for (int i = 0; i < kexue.length(); i++) { if (kexue[i] == 'E') { //我们找出E的位置 for (int j = 0; j < i; j++) { //E左边是尾数 wei_shu[count1++] = kexue[j]; } for (int m = i + 1; m < kexue.length(); m++) { //E右边是指数 zhi_shu[count2++] = kexue[m]; } break; } }
?3.计算指数的int值:
? 由于我们的尾数和指数定义的数组还是char类型的,所以我们在进行整合的时候是不太好进行的,所以我们需要将指数转化成int值。
//计算指数的值 string ex; for(int i=1;i<count2;i++){ //将指数部分放入string中 ex[i-1]=zhi_shu[i]; } int exponent=stoi(ex); //指数值
? 其中stoi()函数是将string类型转化成int类型的重要函数,用的时候很方便。
?4.看尾数数符:
我们知道如果这个数是负的那我们首先应当输出一个负号,如果是正数那不需要输出正号。
//如果是负数先输出一个负号 if(wei_shu[0]=='-'){ cout<<'-'; }
5.看指数数符:
? 我们知道如果指数是一个正数,那么我们的小数点是要往右移动,如果指数是一个负数,那我们的小数点是往左边移动的。所以这要分情况。
? 那我们考虑好这样的情况之后,如果尾数部分够小数点移动的,那我们只需要将小数点移动到那就行了,如果尾数不够小数点移动的,那我们需要在后面补0。
? 接着我们再考虑指数为负的情况,如果指数是-0那我们仍然不需要移动小数点,如果不是-0那我们的小数点就需要往做移动了,所以我们需要在左边补0。
这就是我的大概思路,下面请看我这部分的代码:
//如果指数是正,则小数点往后移动;指数是负数小数点往前移动 if(zhi_shu[0]=='+'){ cout<<wei_shu[1]; if(count1-3<=exponent){//指数超出尾数范围,后面补0 for(int i=3;i<count1;i++){ cout<<wei_shu[i]; } for(int j=0;j<exponent+3-count1;j++){ //补齐0 cout<<'0'; } } else { for(int i=3;i<exponent+3;i++){ cout<<wei_shu[i]; } cout<<'.'; //输出小数点 for(int j=exponent+3;j<count1;j++){ cout<<wei_shu[j]; } } } else { if(exponent==0){ //先判断指数为负,指数值为0的情况 for(int i=1;i<count1;i++){ cout<<wei_shu[i]; } } else { cout<<"0."; //首先输出0. for(int i=0;i<exponent-1;i++){ //在前面补exponent-1个0 cout<<'0'; } cout<<wei_shu[1]; for(int j=3;j<count1;j++){ cout<<wei_shu[j]; } } }
?
???所有的内容都是我挨个挨个打上去的,所以有错别字也别骂我哦,最后可以要一个小小的赞嘛。?