大整数开根 codevs3119
来源:互联网 发布:怎样修改淘宝卖家地址 编辑:程序博客网 时间:2024/04/30 01:06
Description
给出一个正整数n,求n开根号后的整数部分的值。n的位数不超过1000位
Solution
我果然还是好弱啊
二分一个答案然后高精度乘法判断,然后我压位都打错一个晚上就过去了。。
这次的程序应该能当高精度的标了吧
Code
#include <stdio.h>#include <string.h>#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)#define fill(x, t) memset(x, t, sizeof(x))#define max(x, y) ((x)>(y)?(x):(y))#define L 1001#define MOD 1000struct num{ int s[L], len; inline bool operator ==(num b){ num a = *this; if (a.len != b.len){ return 0; }else{ drp(i, a.len, 1){ if (a.s[i] != b.s[i]){ return 0; } } return 1; } } inline bool operator <(num b){ num a = *this; if (a.len < b.len){ return 1; }else if (a.len > b.len){ return 0; }else{ drp(i, a.len, 1){ if (a.s[i] < b.s[i]){ return 1; }else if (a.s[i] > b.s[i]){ return 0; } } return 0; } } inline bool operator <=(num b){ num a = *this; if (a < b || a == b){ return 1; }else{ return 0; } } inline bool operator >(num b){ num a = *this; if (a.len > b.len){ return 1; }else if (a.len < b.len){ return 0; }else{ drp(i, a.len, 1){ if (a.s[i] > b.s[i]){ return 1; }else if (a.s[i] < b.s[i]){ return 0; } } return 0; } } inline bool operator >=(num b){ num a = *this; if (a > b || a == b){ return 1; }else{ return 0; } } inline num operator +(num b){ num a = *this, c = (num){{0}, max(a.len, b.len)}; int v = 0; rep(i, 1, c.len){ c.s[i] = (a.s[i] + b.s[i] + v) % MOD; v = (a.s[i] + b.s[i] + v) / MOD; } if (v){ c.len += 1; c.s[c.len] = v; } return c; } inline num operator -(num b){ num a = *this, c = (num){{0}, max(a.len, b.len)}; rep(i, 1, c.len){ c.s[i] = a.s[i] - b.s[i]; if (c.s[i] < 0){ c.s[i] += MOD; a.s[i + 1] -= 1; } } while (!c.s[c.len] && c.len > 1){ c.len -= 1; } return c; } inline num operator *(num b){ num a = *this, c = (num){{0}, a.len + b.len}; rep(i, 1, a.len){ rep(j, 1, b.len){ c.s[i + j - 1] += a.s[i] * b.s[j]; } } rep(i, 1, a.len + b.len){ c.s[i + 1] += c.s[i] / MOD; c.s[i] %= MOD; } while (!c.s[c.len] && c.len > 1){ c.len -= 1; } return c; } inline num operator /(int b){ num a = *this, c = (num){{0}, a.len}; int v = 0; drp(i, len, 1){ int t = v * MOD + a.s[i]; c.s[i] = t / b; v = t % b; } while (!c.s[c.len] && c.len > 1){ c.len -= 1; } return c; } inline void read(){ fill(s, 0); len = 0; char st[L]; scanf("%s", st); int v = 0, i; for (i = strlen(st) - 1; i >= 3; i -= 3){ rep(j, i - 2, i){ v = v * 10 + st[j] - '0'; } s[++ len] = v; v = 0; } rep(j, 0, i){ v = v * 10 + st[j] - '0'; } s[++ len] = v; } inline void read1(int x){ fill(s, 0); len = 0; do{s[++ len] = x % MOD;}while (x /= MOD); } inline void output(){ num tmp = *this; int i = tmp.len; while (!tmp.s[i] && i > 1){ i -= 1; } printf("%d", tmp.s[i]); drp(j, i - 1, 1){ int v = tmp.s[j]; int f[5] = {0}; rep(k, 1, 3){ f[k] = v % 10; v /= 10; } drp(k, 3, 1){ printf("%d", f[k]); } } printf("\n"); }};num one;int main(void){ one.s[1] = 1; one.len = 1; num p; p.read(); num r = p; num l; l.s[1] = 0; l.len = 1; num mid, ans; while (l <= r){ mid = l + r; mid = mid / 2; num qr = mid * mid; if (qr <= p){ l = mid + one; ans = mid; }else if (qr > p){ r = mid - one; } } ans.output(); return 0;}
1 0
- 大整数开根 codevs3119
- codevs3119 高精度练习之大整数开根
- 大整数开根
- 高精度_大整数开根
- codevs 3119 高精度练习之大整数开根
- 大整数
- 大整数
- 大整数
- 大整数
- 大整数与大整数乘法
- 大整数相乘问题
- 大整数相乘算法
- 大整数相乘算法!
- 大整数相加算法
- 大整数加法
- 大整数运算
- 大整数运算类
- 大整数乘法
- 【PTA 5-11 玩转二叉树 (25分)】+ 二叉树
- 冒泡排序的实际应用
- (泛型)FanXingFanFa
- Python3.X中的异常处理
- Android Arcgis入门(三)、GraphicsLayer添加点、线、面
- 大整数开根 codevs3119
- 解决RedHat6.3/CentOS6系统中“弹出界面eth0:设备似乎不存在”的问题
- B. Anton and Classes
- Android数据库之greendao的基本使用
- (泛型)FanXinglei
- 贝叶斯-笔记(1)
- C++ STL 一般总结
- 阿里笔试_ //如果有人n分钟内,连续发帖M次,将本人封杀掉
- Java入门教程之图书管理系统(由简入繁)(三)