A1060 Are They Equal (25 分)

一、技术总结

  1. cnta、cntb用于记录小数点出现的位置下标,初始化为strlen(字符串)长度。
  2. q、p用于记录第一个非0(非小数点)出现的下标,可以用于计算次方和方便统计输出的字符串,考虑到前面可能出现0。
  3. 如果cnta > p ,说明小数点在第一个开始的非0数的下标的右边,那么科学计数法的指数为cnta – p ; 否则应该为cnta – p + 1; 字符串b同理
  4. 如果字符串p、q等于字符串长度,说明字符串为0,此时直接把 cnta(或者cntb)置为0,因为对于 0来说乘以几次方都是相等的,如果不置为0可能会出现两个0比较导致判断为它们不相等
  5. indexa = 0开始给新的A数组赋值,共赋值n位除去小数点外的正常数字,从p的下标开始。如果p 大于等于strlen,说明字符串遍历完毕后依旧没能满足需要的位数,此时需要在A数组后面补上0 直到满足n位数字。indexb同理,产生新的B数组
  6. 判断A和B是否相等,且cnta和cntb是否相等。如果相等,说明他们用科学计数法表示后是相同的,输出YES,否则输出NO,同时输出正确的科学计数法
  7. 数组开大一点

二、参考代码

#include
#include
using namespace std;
int main(){
    int n, p = 0, q = 0;
    char a[10000], b[10000], A[10000], B[10000];
    scanf("%d%s%s", &n, 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;
        }
    }
    int indexa = 0, indexb = 0;
    while(a[p] == '0' || a[p] == '.') p++;
    while(b[q] == '0' || b[q] == '.') q++;
    if(cnta > p) cnta = cnta - p;
    else cnta = cnta - p + 1;   
    if(cntb > q) cntb = cntb - q;
    else cntb = cntb - q + 1;
    if(p == strlen(a)) cnta = 0;
    if(q == strlen(b)) cntb = 0;
    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;
}

你可能感兴趣的:(A1060 Are They Equal (25 分))