PAT Grade A 1073 Notation scientifique (20 points) | Implémentation C ++

1. Description du titre

Lien du titre original
Insérez la description de l'image ici

Spécification d'entrée:

Chaque entrée contient un cas de test. Pour chaque cas, il y a une ligne contenant le nombre réel A en notation scientifique. Le nombre ne dépasse pas 9999 octets et la valeur absolue de l'exposant ne dépasse pas 9999.

Spécification de sortie:

Pour chaque cas de test, imprimez sur une ligne le nombre d'entrée A dans la notation conventionnelle, avec tous les chiffres significatifs conservés, y compris les zéros de fin.

Exemple d'entrée 1:

+ 1.23400E-03

Exemple de sortie 1:

0,00123400

Exemple d'entrée 2:

-1,2E + 10

Exemple de sortie 2:

-12000000000

Deux idées de résolution de problèmes

Il n'est pas difficile de garder l'esprit clair pour les questions de traitement de chaînes. La notation scientifique donnée dans le titre doit inclure un point décimal, il n'est donc pas nécessaire de considérer séparément la situation sans point décimal. Après avoir entré la chaîne, nous avons deux positions qui doivent être déterminées, l'une est la position du point décimal, et l'autre est la position de E. Nous utilisons posdot et posE pour les représenter. Ensuite, nous classons selon le positif et le négatif de l'indice E. S'il s'agit d'un nombre négatif, ajoutez le chiffre correspondant 0 après la virgule décimale. S'il est 0, vous pouvez directement afficher le nombre précédent. S'il est supérieur à 0, nous devons en discuter à nouveau. La taille de l'index E est-elle supérieure au nombre de chiffres devant lui? S'il est supérieur, 0 doit être ajouté à l'arrière sans point décimal, mais s'il est inférieur à, nous devons afficher le point décimal à un endroit approprié.

Trois, code AC

#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;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42393947/article/details/108723498
conseillé
Classement