PAT 을 급 - 1024. 과학 계수 법 (20) - native

과학 계수 법 은 과학자 들 이 매우 크 거나 작은 숫자 를 나타 내 는 편리 한 방법 으로 정규 표현 식 [+ -] [1 - 9] 을 만족 시 키 는 것 이다. "[0 - 9] + E [+ -] [0 - 9] +, 즉 숫자의 정수 부분 은 1 자리 에 불과 하고 소수 부분 은 적어도 1 자리 가 있 으 며 이 숫자 와 지수 부분의 양음 호 는 양수 에 대해 서도 반드시 명확 하 게 제시 해 야 한다.
현재 과학 계수 법의 형식 으로 실수 A 를 드 립 니 다. 프로그램 을 작성 하여 일반 숫자 표시 법 에 따라 A 를 출력 하고 모든 유효 위 치 를 유지 하도록 하 십시오.
입력 형식:
각 입력 에는 과학 계수 법 으로 표 시 된 실수 A 를 포함 하 는 테스트 용례 가 1 개 씩 포함 되 어 있다.이 숫자의 저장 길 이 는 9999 바이트 를 초과 하지 않 고 지수의 절대 치 는 9999 를 초과 하지 않 는 다.
출력 형식:
모든 테스트 용례 에 대해 한 줄 에서 일반 숫자 표시 법 에 따라 A 를 출력 하고 모든 유효 위 치 를 유지 하 며 끝의 0 을 포함 합 니 다.
입력 샘플 1:
+1.23400E-03
출력 예시 1:
0.00123400
입력 샘플 2:
-1.2E+10
출력 예시 2:
-12000000000
사고방식: 문자열 을 입력 하고 문자열 을 해석 하여 E 뒤의 모든 문자 가 대표 하 는 숫자 를 구하 고 + - 각각 두 개의 변수 로 behindE_plus,behind_E_minus 저장, 대 - 의 경우 원 문자열 앞 에 0 을 추가 하고 behind 를 추가 합 니 다.E_minus 개, 배열 로 이 0 을 저장 합 니 다. 원 문자열 에 E 이전의 순 숫자 를 더 하고 첫 번 째 요소 뒤에 소수점 (이 경우 첫 번 째 요소 뒤에 소수점 이 있어 야 합 니 다) 을 추가 합 니 다. + 의 경우 소수점 이후 E 이전의 요소 개수 count 와 behind 를 고려 해 야 합 니 다.E_plus 의 관계, count < = behindE_plus 는 소수점 을 출력 하지 않 고 원 문자열 의 순 숫자 를 출력 한 후 behind 를 추가 합 니 다.E_plus - count 개 0, count > behindE_plus, 출력 원 문자열 behindE_plus + 1 문자 뒤에 소수점 을 추가 하고 나머지 요 소 를 출력 합 니 다. 위의 모든 출력 은 원래 문자열 의 시작 에 - 있 는 지 여 부 를 판단 하고 있 으 면 출력 할 때 추가 하면 됩 니 다.
 #include<iostream>
#include<cstring> 
using namespace std;
int main()
{
    string a;
    char b[100000];
    cin>>a;
    int j=0;
    int behind_E_plus=0;        //  E+            
    int behind_E_minus=0;       //  E-            

    int  e=0;
    for(int i=0;i<a.length();i++)  //   E+,E-            
    {
        if(e==1)
        {
            behind_E_plus=behind_E_plus*10+(a[i]-'0');
        }
        if(e==2)
        {
            behind_E_minus=behind_E_minus*10+(a[i]-'0');
        }
        if(a[i-1]=='E'&&a[i]=='+')  e=1;
        if(a[i-1]=='E'&&a[i]=='-')  e=2;
    }
    if(behind_E_minus!=0)           //      E-    
    {
        for(int i=0;i<behind_E_minus;i++)  //  b     behind_E_minus 0 
        {
            b[j++]='0';
        }
        for(int i=0;i<a.length();i++)  //       E      
        {
            if(a[i]=='E') break;
            if(a[i]>='0'&&a[i]<='9')
            b[j++]=a[i];
        }
        for(int i=1;i<j;i++)        //  ,         -   
        {                           
        if(i==1&&a[0]=='-')
        cout<<"-";
        if(i==1)
        cout<<b[0]<<".";            //            
        cout<<b[i];
        }
    }
    else                            //      E+    
    {
        int count;                    //            
        bool begin=false;             //                
        for(int i=0;i<a.length();i++) //       E         b             
        {                                       
            if(a[i]=='E') break;
            if(begin) count++;
            if(a[i]=='.')  begin=true; 
            if(a[i]>='0'&&a[i]<='9')
            {
                b[j++]=a[i];
            } 
        }       //     0, behind_E_plus<=count      
        for(int i=0;i<behind_E_plus-count;i++)
        {
            b[j++]='0';
        }   
        if(behind_E_plus-count<0) //  behind_E_plus<count,   behind_E_plus+1
        {                           //   ,       ,         
            if(a[0]=='-')
            cout<<"-";
            int k=0;
            for(int i=0;i<(behind_E_plus)+1;i++)
            {
                cout<<b[i];
                k=i;
            }
            cout<<".";
            for(int i=k+1;i<j;i++)
            {
            cout<<b[i];
            }
        }       
        else        //  behind_E_plus>=count         
        {
            for(int i=0;i<j;i++)
            {
                if(i==0&&a[0]=='-')
                cout<<"-";
                cout<<b[i];
            }
        }               

    }
    return 0;
}

제목 링크:
https://www.patest.cn/contests/pat-b-practise/1024

좋은 웹페이지 즐겨찾기