大数开方,结果不超过整型范围。我用的高精和二分在POJ通过了,在UVA没通过。后来在网上看到有大牛直接用double过了,实在让人佩服啊。
我的代码:
#include <stdio.h> #include <string.h> // 交换字符串函数 void swap_str(char str[]) { int len = strlen(str); for (int i=0; i<len/2; i++) { int tmp = str[i]; str[i] = str[len-i-1]; str[len-i-1] = tmp; } } // 大数与整型相乘函数(大数以字符串形式给出) void my_mul(char str[], int x) { int len = strlen(str); int cp = 0, i, tmp; swap_str(str); for (i=0; i<len; i++) { tmp = (str[i]-'0')*x + cp; str[i] = (tmp%10) + '0'; cp = tmp / 10; } while (cp) { str[i++] = (cp%10) + '0'; cp /= 10; } while ('0'==str[i-1] && i>1) i--; str[i] = '\0'; swap_str(str); } // 比较两个大数的大小(大数前没有0) int my_numCmp(char str1[], char str2[]) { int len1, len2; len1 = strlen(str1); len2 = strlen(str2); if (len1 > len2) return 1; if (len1 < len2) return -1; return strcmp(str1, str2); } // 字符串存储开方结果 void my_pow(char str[], int k, int n) { str[0] = '1', str[1] = '\0'; while (n--) { my_mul(str, k); } } // 二分查找正确答案 int my_binary_search(int n, char str[]) { int high = 1e9, low = 0; int mid; char tot[2005]; while (low < high) { mid = low + (high-low)/2; my_pow(tot, mid, n); int tmp = my_numCmp(tot, str); if (0 == tmp) return mid; if (tmp < 0) low = mid + 1; else high = mid; } return mid; } int main() { char str[105]; int n; while (scanf("%d%s", &n, str) != EOF) { printf("%d\n", my_binary_search(n, str)); } return 0; }
牛人代码:
#include <stdio.h> #include <math.h> int main() { double n, p; while (scanf("%lf%lf", &n, &p) != EOF) { printf("%.lf\n", pow(p, 1/n)); } return 0; }