pat甲级1060(25分)c++
类型:字符串处理
#include <iostream>
#include <cstring>
using namespace std;
/*
* 题目大意:
* 输入:
* N是科学技术法有效的位数,A和B是两个需要转化的数
* 输出:
* 按照N位有效数字,转化A和B,如果结果一样,则Yes,否则No,并按格式输出
*/
int main() {
//初始化
int n, p = 0, q = 0;
char a[10000], b[10000], A[10000], B[10000];
scanf("%d%s%s", &n, a, b);
//cnta和cntb分别获取a和b的小数点的位置,如果没有则为整数
int cnta = strlen(a), cntb = strlen(b);
for (int i = 0; i < strlen(a); i++) {
if (a[i] == '.') {
cnta = i;
break;
}
}
for (int i = 0; i < strlen(b); i++) {
if (b[i] == '.') {
cntb = i;
break;
}
}
//indexa和indexb分别获取a和b非零整数的位置
int indexa = 0, indexb = 0;
while (a[p] == '0' || a[p] == '.') p++;
while (b[q] == '0' || b[q] == '.') q++;
//cnta和cntb获取转化为0.p,需要添加或减少的10的次方,比如12300需要添加5,0.012需要减小1
if (cnta >= p)
cnta = cnta - p;
else
cnta = cnta - p + 1;
if (cntb >= q)
cntb = cntb - q;
else
cntb = cntb - q + 1;
//处理的是特殊情况,a或b为0
if (p == strlen(a))
cnta = 0;
if (q == strlen(b))
cntb = 0;
//将a和b转化为对应的科学计数法,并存储到A和B
while (indexa < n) {
if (a[p] != '.' && p < strlen(a))
A[indexa++] = a[p];
else if (p >= strlen(a))
A[indexa++] = '0';
p++;
}
while (indexb < n) {
if (b[q] != '.' && q < strlen(b))
B[indexb++] = b[q];
else if (q >= strlen(b))
B[indexb++] = '0';
q++;
}
//输出
if (strcmp(A, B) == 0 && cnta == cntb)
printf("YES 0.%s*10^%d", A, cnta);
else
printf("NO 0.%s*10^%d 0.%s*10^%d", A, cnta, B, cntb);
return 0;
}
这道题理解很简单,主要是处理字符串的操作,感觉很麻烦,需要考虑很多情况,总而言之,会需要多次测试