PAT Grado A 1073 Notación científica (20 puntos) | Implementación de C ++

1. Descripción del título

Enlace del título original
Inserte la descripción de la imagen aquí

Especificación de entrada:

Cada entrada contiene un caso de prueba. Para cada caso, hay una línea que contiene el número real A en notación científica. El número no tiene más de 9999 bytes de longitud y el valor absoluto del exponente no es más de 9999.

Especificación de salida:

Para cada caso de prueba, imprima en una línea el número de entrada A en la notación convencional, manteniendo todas las cifras significativas, incluidos los ceros finales.

Entrada de muestra 1:

+ 1.23400E-03

Salida de muestra 1:

0,00123400

Entrada de muestra 2:

-1,2E + 10

Salida de muestra 2:

-12000000000

Dos ideas para resolver problemas

No es difícil mantener la cabeza despejada para las preguntas sobre el procesamiento de cadenas. La notación científica dada en el título debe incluir un punto decimal, por lo que no es necesario considerar la situación por separado sin un punto decimal. Después de ingresar la cadena, tenemos dos posiciones que deben determinarse, una es la posición del punto decimal y la otra es la posición de E. Usamos posdot y posE para representarlas. Posteriormente, clasificamos de acuerdo con el positivo y negativo del índice E. Si es un número negativo, agregue el dígito correspondiente 0 después del punto decimal. Si es 0, puede generar directamente el número anterior. Si es mayor que 0, tenemos que discutirlo nuevamente. ¿El tamaño del índice E es mayor que el número de dígitos delante de él? Si es mayor, se debe agregar 0 en la parte posterior sin un punto decimal, pero si es menor que, debemos enviar el punto decimal en un lugar adecuado.

Tres, código de CA

#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
int to_num(string s)
{
    
    
    int re = 0, sze = s.length();
    int st = 1;
    for(int i=st; i<sze; i++)
    {
    
    
        re = re*10 + s[i] - '0';
    }
    if(s[0] == '-') re = -re;
    return re;
}
int main()
{
    
    
    int posdot, posE;
    string str;
    cin >> str;
    int sze = str.length();
    if(str[0] == '-')   printf("-");
    for(int i=0; i<sze; i++)
    {
    
    
        if(str[i] == '.')   posdot = i;
        if(str[i] == 'E')   posE = i;
    }
    string exp = str.substr(posE+1, sze-posE-1);
    int e = to_num(exp);
    if(e < 0)
    {
    
    
        e = -e;
        printf("0.");
        for(int i=0; i<e-1; i++)    printf("0");
        cout << str[posdot-1];
        for(int i=posdot+1; i<posE; i++)    cout << str[i];
    }
    else if(e == 0)
    {
    
    
        for(int i=posdot-1; i<posE; i++)    cout << str[i];
    }
    else
    {
    
    
        int afterdot = posE - posdot - 1;
        if(e >= afterdot)
        {
    
    
            cout << str[posdot-1];
            for(int i=posdot+1; i<posE; i++)    cout << str[i];
            for(int i=0; i<e-afterdot; i++) printf("0");
        }
        else
        {
    
    
            cout << str[posdot-1];
            for(int i=0; i<e; i++)
            {
    
    
                cout << str[posdot+1+i];
            }
            printf(".");
            for(int i=posdot+1+e; i<posE; i++)   cout << str[i];
        }
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_42393947/article/details/108723498
Recomendado
Clasificación