poj2109 Power of Cryptography
Description
This problem involves the efficient computation of integer roots of numbers.
Given an integer n>=1 and an integer p>= 1 you have to write a program that determines the n th positive root of p. In this problem, given such integers n and p, p will always be of the form k to the nth. power, for an integer k (this integer is what your program must find).
Input
Output
Sample Input
2 16 3 27 7 4357186184021382204544
Sample Output
4 3 1234
这题可以用double型做,
类型 长度 (bit) 有效数字 绝对值范围
float 32 6~7 10^(-37) ~ 10^38
double 64 15~16 10^(-307) ~10^308
long double 128 18~19 10^(-4931) ~ 10 ^ 4932
因为k^n=p,所以k=p^(1.0/n);
#include<stdio.h> #include<math.h> int main() { double n,m; while(scanf("%lf%lf",&n,&m)!=EOF) { printf("%.0f\n",pow(m,(1.0)/n)); } return 0; }
也可以用二分法做
#include<stdio.h> #include<string.h> #include<math.h> #define eps 1e-8 int main() { double n,m,i,j,h,temp; int l,r,mid; while(scanf("%lf%lf",&n,&m)!=EOF) { r=1000000000; l=1; while(l<=r){ mid=(l+r)/2; temp=pow(mid,n); //printf("%lf %lf\n",temp,pow(mid,n)); if(fabs(pow(mid,n)-m)<eps){ printf("%d\n",mid);break; //因为这里求的是一个确定的整数,所以可以直接输出 } else if(pow(mid,n)<m){ l=mid+1; } else if(pow(mid,n)>m){ r=mid-1; } } } return 0; }