상세 컨텐츠

본문 제목

9658. 유효숫자 표기 D3

알고리즘/SWExpertAcademy

by 아리따운노을 2020. 3. 11. 23:47

본문

※ SW expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

 

주어진 정수의 앞 두 자리를 유효숫자로 하여 표기하는 프로그램을 작성하세요.
 

예를 들어 정수 588235는 5.88235*105 인데, 앞의 소수 부분을 소수점 두 번째 자리에서 반올림하여 5.9*105로 나타내는 것입니다.
 

하나의 예외로, 9999 같은 경우 9.999*103에서 9.999의 소수점 두 번째 자리를 반올림하여 1.0*104으로 나타내야 합니다.


 

[입력]
 

첫 번째 줄에 테스트 케이스의 수 TC가 주어진다

이후 TC개의 테스트 케이스가 새 줄로 구분되어 주어진다.

각 테스트 케이스마다 하나의 정수 N이 주어진다. ( 102 ≤ N ≤ 10100000)




[출력]
 

각 테스트 케이스마다 ‘# ’( t 는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

주어진 정수의 앞 두 자리를 유효숫자로 하여 출력한다. 출력 예제의 형식을 따라 출력해야 한다.

 

 

유효숫자의 개념이므로 숫자가 아무리 길어도 앞의 3자리만 보면 된다. 뒤의 숫자는 자리수만 결정할뿐 유효숫자를 표현하는데 아무 영향을 주지 않는다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int tc;
    string s;
    cin>>tc;
    for(int t=1;t<=tc;t++)
    {
        cin>>s;
        if(s[2]-'0'<5)
            printf("#%d %c.%c*10^%d\n",t, s[0],s[1], s.length()-1);
        else if(s[2]-'0'>=5&&s[1]-'0'<9)
            printf("#%d %c.%c*10^%d\n",t, s[0],s[1]+1, s.length()-1);
        else if(s[1]-'0'==9&&s[2]-'0'>=5)
        {
            if(s[0]-'0'==9)
                printf("#%d 1.0*10^%d\n",t, s.length());
            else
                printf("#%d %c.0*10^%d\n",t, s[0]+1, s.length()-1);
        }
        
    }
    return 0;
}
 
cs

1. 3번째 수가 5보다 작으면 올림이 일어나지 않으므로 그냥 출력 ex)624 -> 6.24*10^2

2. 3번째 수가 5보다 크고 2번째 수가 9보다 작으면 1번째 자리까지 올림이 일어나지 않으므로 2번째 수에 +1만 해서 출력 ex) 349 -> 3.5*10^2

3. 3번째 수가 5보다 크고 2번째수가 9인 경우 1번째 수까지 올림이 일어남

3-1 첫번째 자리가 9일경우 

  나타내는 1,2번째 숫자가 둘다 9고 3번째 자리에서 올림이 일어나는 경우.

  이럴 경우 그냥 1.0 * 10^문자의 길이 -> 일반적으론 문자의 길이 -1 이지만 올림 때문에 한자리가 더 추가 됨 ex) 997-> 1.0*10^3

3-2 첫번째 자리가 9가 아니고 둘째 자리는 9인 경우 경우 

  1번째 자리는 1이 추가가 되고 2번째 자리는 0이 됨. ex) 899 -> 9.0 * 10^2

 

 

 

 

 

관련글 더보기

댓글 영역