【PAT甲级】1060. Are They Equal (25)

注:这里对于两个数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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值