POJ 3100 Root of the Problem (내 수제의 길 - A^N을 취하여 B에 가장 가까운 A)

Root of the Problem
Time Limit: 1000MS
 
Memory Limit: 65536K
Total Submissions: 10067
 
Accepted: 5372
Description
Given positive integers B and N, find an integer A such that AN is as close as possible to B. (The result A is an approximation to the Nth root of B.) Note that AN may be less than, equal to, or greater than B.
Input
The input consists of one or more pairs of values for B and N. Each pair appears on a single line, delimited by a single space. A line specifying the value zero for both B and N marks the end of the input. The value of B will be in the range 1 to 1,000,000 (inclusive), and the value of N will be in the range 1 to 9 (inclusive).
Output
For each pair B and N in the input, output A as defined above on a line by itself.
Sample Input
4 3
5 3
27 3
750 5
1000 5
2000 5
3000 5
1000000 5
0 0

Sample Output
1
2
3
4
4
4
5
16

Source
Mid-Central USA 2006
두 개의 숫자 B와 N을 입력합니다.A^N이 B에 가장 가까워질 수 있도록 A를 찾으라고 요구합니다.
처음에는 폭력이 생각났지만, 생각해 보면 아마도 이 문제를 다른 방식으로 풀 수 있을 것이다.math를 충분히 이용하다.h의 pow(), 먼저 B에 n차방을 열면 pow(b,1.0/n)를 사용한다.값right를 얻어서 각각 이 값에 대해 하이와 하이를 따서 파워(high, n), 파워(low, n)를 계산하고 이 두 값 중 가장 작은 것을 비교하는 것이 답이다.
참고 사항:
1) B를 개방할 때는 부동 소수점 유형의 값을 사용합니다.
2) n=1 또는 b=1일 때 b를 직접 출력하면 최적화된 셈이다.
코드(1AC):
#include <cstdio>
#include <cstdlib>
#include <cmath>

int main(void){
    int min, tmp;
    int n, b;
    float right;
    int low, high;

    while (scanf("%d%d", &b, &n), n != 0 || b != 0){
        if (n == 1 || b == 1){
            printf("%d
", b); continue; } right = pow(b, 1.0 / n); low = (int)right; high = (int)(right + 0.9999); min = b - pow(low, n); tmp = pow(high, n) - b; if (tmp < min){ printf("%d
", high); } else{ printf("%d
", low); } } return 0; }

코드(1AC):

좋은 웹페이지 즐겨찾기