poj 2109

代码1:discuss中的代码

 

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cmath>  
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.        double n,m;  
  9.   
  10.        while(scanf("%lf%lf",&n,&m)==2)  printf("%.0lf\n",pow(m,1/n));  
  11.         return 0;  
  12. }  



代码2:高精度 + 二分

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <cstring>  
  3. #include <cstdio>  
  4. using namespace std;  
  5.   
  6. const int base = 10000;  
  7. const int width = 4;  
  8. const int N = 1000;  
  9.   
  10. struct bint{  
  11.    int ln, v[N];  
  12.    bint (int r = 0) {  
  13.        for (ln = 0; r > 0; r /= base) v[ln++] = r % base;  
  14.    }  
  15.    bint& operator = (const bint& r) {  
  16.        memcpy(this, &r, (r.ln + 1) * sizeof(int));  
  17.        return *this;  
  18.    }  
  19. };  
  20. bool operator < (const bint& a, const bint& b) {  
  21.     int i;  
  22.     if (a.ln != b.ln) return a.ln < b.ln;  
  23.     for (i = a.ln - 1; i >= 0 && a.v[i] == b.v[i]; i--);  
  24.     return i < 0 ? 0 : a.v[i] < b.v[i];  
  25. }  
  26. bool operator <= (const bint& a, const bint& b) {  
  27.     return !(b < a);  
  28. }  
  29. bint operator + (const bint& a, const bint& b) {  
  30.     bint res; int i, cy = 0;  
  31.     for (i = 0; i < a.ln || i < b.ln || cy > 0; i++) {  
  32.         if (i < a.ln) cy += a.v[i];  
  33.         if (i < b.ln) cy += b.v[i];  
  34.         res.v[i] = cy % base; cy /= base;  
  35.     }  
  36.     res.ln = i;  
  37.     return res;  
  38. }  
  39. bint operator - (const bint& a, const bint& b) {  
  40.     bint res; int i, cy = 0;  
  41.     for (res.ln = a.ln, i = 0; i < res.ln; i++) {  
  42.         res.v[i] = a.v[i] - cy;  
  43.         if (i < b.ln) res.v[i] -= b.v[i];  
  44.         if (res.v[i] < 0) cy = 1, res.v[i] += base;  
  45.         else cy = 0;  
  46.     }  
  47.     while (res.ln > 0 && res.v[res.ln - 1] == 0) res.ln--;  
  48.     return res;  
  49. }  
  50. bint operator * (const bint& a, const bint& b) {  
  51.     bint res; res.ln = 0;  
  52.     if (0 == b.ln) { res.v[0] = 0; return res; }  
  53.     int i, j, cy;  
  54.     for (i = 0; i < a.ln; i++) {  
  55.         for (j = cy = 0; j < b.ln || cy > 0; j++, cy /= base) {  
  56.             if (j < b.ln) cy += a.v[i] * b.v[j];  
  57.             if (i + j < res.ln) cy += res.v[i + j];  
  58.             if (i + j >= res.ln) res.v[res.ln++] = cy % base;  
  59.             else res.v[i + j] = cy % base;  
  60.         }  
  61.     }  
  62.     return res;  
  63. }  
  64. bint operator / (const bint& a, const bint& b)  
  65. {  
  66.     bint tmp, mod, res;  
  67.     int i, lf, rg, mid;  
  68.     mod.v[0] = mod.ln = 0;  
  69.     for (i = a.ln - 1; i >= 0; i--) {  
  70.         mod = mod * base + a.v[i];  
  71.         for (lf = 0, rg = base - 1; lf < rg; ) {  
  72.              mid = (lf + rg + 1) / 2;  
  73.              if (b * mid <= mod) lf = mid;  
  74.              else rg = mid - 1;  
  75.         }  
  76.         res.v[i] = lf;  
  77.         mod = mod - b * lf;  
  78.     }  
  79.     res.ln = a.ln;  
  80.     while (res.ln > 0 && res.v[res.ln - 1] == 0) res.ln--;  
  81.     return res;  
  82. }  
  83. int digits(bint& a)  
  84. {  
  85.     if (a.ln == 0) return 0;  
  86.     int l = ( a.ln - 1 ) * 4;  
  87.     for (int t = a.v[a.ln - 1]; t; ++l, t /= 10);  
  88.     return 1;  
  89. }  
  90. bool read(bint& b, char buf[])  
  91. {  
  92.     if (1 != scanf("%s", buf)) return 0;  
  93.     int w, u, ln = strlen(buf);  
  94.     memset(&b, 0, sizeof(bint));  
  95.     if ('0' == buf[0] && 0 == buf[1]) return 1;  
  96.     for (w = 1, u = 0; ln; ) {  
  97.         u += (buf[--ln] - '0') * w;  
  98.         if (w * 10 == base) {  
  99.             b.v[b.ln++] = u; u = 0; w = 1;  
  100.         }  
  101.         else w *= 10;  
  102.     }  
  103.     if (w != 1) b.v[b.ln++] = u;  
  104.     return 1;  
  105. }  
  106. void write(const bint& v) {  
  107.     int i;  
  108.     printf("%d", v.ln == 0 ? 0 : v.v[v.ln - 1]);  
  109.     for (i = v.ln - 2; i >= 0; i--)  
  110.          printf("%04d", v.v[i]);  
  111.     printf("\n");  
  112. }  
  113.   
  114. int judge(bint v, bint num, int n)  
  115. {  
  116.     bint tmp(1);  
  117.     for (int i = 1; i <= n; i++)  
  118.     {  
  119.         tmp = tmp * v;  
  120.         if (num < tmp) return 1;  
  121.     }  
  122.     if (tmp < num) return -1;  
  123.     return 0;  
  124. }  
  125.   
  126. int main()  
  127. {  
  128.     char buf[105];  
  129.     int n, ans;  
  130.     bool flag;  
  131.     bint p;  
  132.     while(scanf("%d", &n) != EOF)  
  133.     {  
  134.          //cin >> n;  
  135.          getchar();  
  136.          read(p, buf);  
  137.   
  138.          bint l(1), mid, r, div(2), one(1);  
  139.          r = p; flag = false;  
  140.          while (l < r)  
  141.         {  
  142.              mid = (l + r) / div;  
  143.              ans = judge(mid, p, n);  
  144.              if (ans == 1)  
  145.                  r = mid;  
  146.              else if (ans == -1)  
  147.                  l = mid + one;  
  148.              else { write(mid); flag = truebreak; }  
  149.         }  
  150.         if (flag) continue;  
  151.         write(l - 1);  
  152.     }  
  153.     return 0;  
  154. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值