Current work in cryptography involves (among other things) large prime numbers and computing powers of numbers modulo functions of these primes. Work in this area has resulted in the practical use of results from number theory and other branches of mathematics once considered to be of only theoretical interest.
This problem involves the efficient computation of integer roots of numbers.
Given an integer and an integer you are to write a program that determines , the positive root of p. In this problem, given such integers n and p, p will always be of the form for an integerk (this integer is what your program must find).
The input consists of a sequence of integer pairs n and p with each integer on a line by itself. For all such pairs , and there exists an integer k, such that .
For each integer pair n and p the value should be printed, i.e., the number k such that .
2 16 3 27 7 4357186184021382204544
4 3 1234
double能表示的范圍是-1.7e308 ~ 1.7e308,精度至少為15位,而輸出結果在int的范圍內,即10位,所以可以輸出可以用double
至於計算過程中為什麼能用double而不會影響到結果,我也暫時沒搞懂,因為double的精度只有15位,最多也才有16位,但是p的范圍是10^101,輸入過程中用的也不是科學計數法,15位後的值肯定被抹掉了,結果卻是對的。
正確的分析應該在這:http://blog.csdn.net/synapse7/article/details/11672691,用到了誤差分析,得出的結果是在這一題裡失去的精度不會影響答案,等我數學補上來之後來研究(吐槽一下網上的好多人,風輕雲淡的就發上來了,真的懂了麼?自己不扎實不要緊,關鍵在於誤導了新手)
1 #include<stdio.h> 2 #include<math.h> 3 4 int main(void) 5 { 6 double n,p; 7 8 while(scanf("%lf%lf",&n,&p) != EOF) 9 printf("%.lf\n",pow(p,1 / n)); 10 11 return 0; 12 }