模拟题介绍
入门模拟题 分为简单模拟,查找元素,图形输出,日期处理,进制转换字符串处理等等!
何为模拟题?
模拟题是一类“题目怎么说,你就怎么做的”的一类题目。此类题目不涉及算法,完全根据题目描述进行代码的编写,主要考察代码能力!!!
模拟题 ———— 字符串处理(拔高题)
【PAT 乙级 B 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
题目说明
你是否一头雾水而不知何处下手?(其实我一开始也是这样的,后来我选择克服它,我不信我做不出来)
该题其实难度相对于PAT 甲级 1082 Read Number in Chinese (25分)
相当简单啦!
有兴趣可以看题解 :1082 Read Number in Chinese (25分)
为什么简单呢?因为讨论的情况较少
题解思路
题意:
将科学计数法的形势变成不是科学计数法的形式,关于如何变,题目已经很清楚啦!
三种情况讨论:
-
当指数为正数,且该指数未超过该小数的小数点后的位数,那么小数点是保留的
比如 +1.23400E+03 ,结果为1234.00 -
当指数为正数,且该指数超过该小数的小数点后的位数,那么小数点是不保留的
比如 +1.23400E+05 ,结果为123400 -
当指数负数,那么小数点是保留的,且在小数点添加0. 00…
比如 +1.23400E-05 ,结果为0.0000123400
比如 +1.23400E-03 ,结果为0.00123400
规律:只需要在小数前添加0. 随后添加 (指数 - 1)个 0, 再将原来的小数去掉小数点后补上即可
题解过程
以+1.23400E+03 为例
首先将字符串的指数剥离开来存放到sum中
再使用两个字符变量分别来存储小数前的正负号和指数前的正负号
接着用b数组来存储小数部分
最后使用c数组来存储变化后的小数
题解代码
#include <cstdio>
#include <cstring>
char a[10005], b[10005],c[10005];
int main()
{
gets(a);
int sum = 0; int temp = 1;
char ch1, ch2;
int i;
for (i = strlen(a) - 1; a[i] != '+' && a[i] != '-'; i--)
{
sum += (a[i] - '0') * temp;
temp = 10 * temp;
}//求sum大小
ch2 = a[i];//指数正负号
ch1 = a[0];//小数正负号
int k = 0;
for (int j = 1; j < i - 1; j++)
{
b[k++] = a[j];
}//存储小数部分
//----------------------------------
int lentail = i - 4;//小数部分小数点后的长度
//特殊情况处理一下
if (ch1 == '-') printf("-");
if (sum == 0) printf("%s", b);
if (ch2 == '+') {//指数为正
if (sum < lentail)//小于小数中小数点后的长度
{
int t = 0;
int m;
for ( m = 0; m <= sum + 1; m++)
{
if (b[m] == '.') continue;
else {
c[t++] = b[m];
}
}
c[t++] = '.';
for (int n = m; n < strlen(b); n++)
c[t++] = b[n];
c[t] = '\0';
printf("%s", c);
}
else {//大于小数点后的长度
int t = 0;
for (int m = 0; m < strlen(b); m++)
{
if (b[m] == '.') continue;
else {
c[t++] = b[m];
}
}
for (int n = 0; n < sum - lentail; n++)
c[t++] = '0';
c[t] = '\0';
printf("%s", c);
}
}
if (ch2 == '-'){//指数为负
c[0] = '0';
c[1] = '.';
int t = 2;
for (int m = 0; m < sum - 1; m++)
c[t++] = '0';
for (int n = 0; n < strlen(b); n++)
{
if (b[n] == '.') continue;
c[t++] = b[n];
}
c[t] = '\0';
printf("%s", c);
}
return 0;
}