注:这里对于两个数a和b的处理是相同的,代码有重复
注2:要对特殊情况进行处理,比如前面无效的0,以及“00.000”等特殊输入
注3:有效数字N < 100,但输入长度可能远大于100
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int hasPoint(char *a, int an);
int firstNoZero(char *a, int an);
int main(int argc, char *argv[]) {
int i, j, k;
int n;
char a[10000], b[10000];
char aout[10000], bout[10000];
memset(aout, '0', 10000 * sizeof(char));
memset(bout, '0', 10000 * sizeof(char));
bool flag = true;
scanf("%d %s %s", &n, a, b);
int an = strlen(a);
int bn = strlen(b);
int ap = hasPoint(a, an);
int bp = hasPoint(b, bn);
int anz = firstNoZero(a, an);
int bnz = firstNoZero(b, bn);
int ae = 0; int be = 0;
if (anz == an) {
ae = 0;
aout[1] = '.';
} else if (ap >= 0 && anz >= ap + 1) {
ae = -(anz - ap - 1);
aout[0] = '0';
aout[1] = '.';
for (i = 2; i < an - ae; i++) {
aout[i] = a[anz + i - 2];
}
an = an - ae;
} else if (ap >= 0 && anz < ap + 1) {
ae = ap - anz;
aout[0] = '0';
aout[1] = '.';
i = j = anz;
while (j < an) {
if (j != ap) {
aout[2 + i - anz] = a[j];
i++; j++;
} else {
j++;
}
}
} else if (ap == -1) {
ae = an - anz;
aout[0] = '0';
aout[1] = '.';
for (i = anz; i < an; i++) {
aout[2 + i - anz] = a[i];
}
}
if (bnz == bn) {
be = 0;
bout[1] = '.';
} else if (bp >= 0 && bnz >= bp + 1) {
be = -(bnz - bp - 1);
bout[0] = '0';
bout[1] = '.';
for (i = 2; i < bn - be; i++) {
bout[i] = b[bnz + i - 2];
}
bn = bn - be;
}else if (bp >= 0 && bnz < bp + 1) {
be = bp - bnz;
bout[0] = '0';
bout[1] = '.';
i = j = bnz;
while (j < bn) {
if (j != bp) {
bout[2 + i - bnz] = b[j];
i++; j++;
} else {
j++;
}
}
} else if (bp == -1) {
be = bn - bnz;
bout[0] = '0';
bout[1] = '.';
for (i = bnz; i < bn; i++) {
bout[2 + i - bnz] = b[i];
}
}
if (ae != be) flag = false;
else {
for (i = 0; i < n; i++) {
if (aout[i + 2] != bout[i + 2]) {
flag = false;
}
}
}
if (flag) {
printf("YES ");
for (i = 0; i < n + 2; i++) {
printf("%c", aout[i]);
}
printf("*10^");
printf("%d", ae);
} else {
printf("NO ");
for (i = 0; i < n + 2; i++) {
printf("%c", aout[i]);
}
printf("*10^");
printf("%d", ae);
printf(" ");
for (i = 0; i < n + 2; i++) {
printf("%c", bout[i]);
}
printf("*10^");
printf("%d", be);
}
printf("\n");
return 0;
}
int hasPoint(char *a, int an) {
for (int i = 0; i < an; i++) {
if (a[i] == '.')
return i;
}
return -1;
}
int firstNoZero(char *a, int an) {
int i = 0;
while ((a[i] == '0' || a[i] == '.') && i < an) {
i++;
}
return i;
}