VIjos 大整数(超级恶心的高精)
来源:互联网 发布:视觉训练软件 编辑:程序博客网 时间:2024/04/29 22:12
背景代码
很久很久以前,有个整数很大很囧
描述
一个k(1<=k<=80)位的十进制正整数N,就是所谓的大整数.
请你设计程序,对于给出的某一个大整数N,找到满足p^3+p^2+3p<=n的p的最大值.
格式
输入格式
输入数据只有一行,是一个K位的大整数N,行首行未无多余空格
输出格式
输出第一行为你所找到的P最大值,行首行末别乱加东西
样例1
样例输入1
1000000000000001000000000000003000000000000001
样例输出1
1000000000000000
1 /* 2 一道不错的高精练手题 3 先确定p的位数 4 然后从大到小找合适的p 5 k最多80位 6 p那最多 28位 7 假设每一位都用0-9试一遍 8 最多试不超过300遍 9 即使加上高精复杂度也不会太高 10 */ 11 #include<cstdio> 12 #include<cstring> 13 #include<iostream> 14 #define MAXN 1010 15 16 using namespace std; 17 18 char s[MAXN]; 19 20 int a[MAXN],b[MAXN],c[MAXN],e[MAXN],n[MAXN],_w; 21 22 inline bool judge() { 23 if(e[0]<n[0]) return true; 24 if(e[0]>n[0]) return false; 25 for(int i=n[0];i>=1;i--) { 26 if(e[i]>n[i]) return false; 27 if(e[i]<n[i]) return true; 28 } 29 return true; 30 } 31 32 inline void check() { 33 for(int i=1;i<=a[0];i++) { 34 if(a[i]<0) { 35 a[i+1]--; 36 a[i]+=10; 37 } 38 } 39 while(a[0]>1&&!a[a[0]]) a[0]--; 40 return; 41 } 42 43 inline void _pluss() { 44 a[_w]++; 45 a[0]++; 46 for(int i=1;i<=a[0];i++) { 47 if(a[i]>=10) { 48 a[i+1]++; 49 a[i]-=10; 50 } 51 } 52 while(a[0]>0&&!a[a[0]]) a[0]--; 53 return; 54 } 55 56 inline void __mul() { 57 for(int i=0;i<=a[0];i++) b[i]=a[i]; 58 c[0]=a[0]+b[0]+1; 59 for(int i=1;i<=a[0];i++) 60 for(int j=1;j<=b[0];j++) 61 c[i+j-1]+=a[i]*b[j]; 62 for(int i=1;i<=c[0];i++) 63 if(c[i]>=10) { 64 c[i+1]+=c[i]/10; 65 c[i]%=10; 66 } 67 while(c[0]&&!c[c[0]]) c[0]--; 68 for(int i=c[0];i>=0;i--) b[i]=c[i],c[i]=0; 69 c[0]=a[0]+b[0]+1; 70 for(int i=1;i<=a[0];i++) 71 for(int j=1;j<=b[0];j++) 72 c[i+j-1]+=a[i]*b[j]; 73 for(int i=1;i<=c[0];i++) 74 if(c[i]>=10) { 75 c[i+1]+=c[i]/10; 76 c[i]%=10; 77 } 78 while(c[0]&&!c[c[0]]) c[0]--; 79 e[0]=max(e[0],c[0])+1; 80 for(int i=1;i<=e[0];i++) { 81 e[i]+=c[i]; 82 if(e[i]>=10) { 83 e[i+1]+=e[i]/10; 84 e[i]%=10; 85 } 86 } 87 while(e[0]&&!e[e[0]]) e[0]--; 88 memset(c,0,sizeof c); 89 memset(b,0,sizeof b); 90 } 91 92 inline void _mul() { 93 for(int i=0;i<=a[0];i++) b[i]=a[i]; 94 c[0]=a[0]*2+1; 95 for(int i=1;i<=a[0];i++) 96 for(int j=1;j<=b[0];j++) 97 c[i+j-1]+=a[i]*b[j]; 98 for(int i=1;i<=c[0];i++) 99 if(c[i]>=10) {100 c[i+1]+=c[i]/10;101 c[i]%=10;102 }103 while(c[0]&&!c[c[0]]) c[0]--;104 e[0]=max(e[0],c[0])+1;105 for(int i=1;i<=e[0];i++) {106 e[i]+=c[i];107 if(e[i]>=10) {108 e[i+1]+=e[i]/10;109 e[i]%=10;110 }111 }112 while(e[0]&&!e[e[0]]) e[0]--;113 memset(c,0,sizeof c);114 memset(b,0,sizeof b);115 }116 117 inline void pluss() {118 for(int i=1;i<=a[0];i++) b[i]=0;119 b[0]=a[0]+1;120 for(int i=1;i<=b[0];i++) {121 b[i]+=3*a[i];122 if(b[i]>=10) {123 b[i+1]+=b[i]/10;124 b[i]%=10;125 }126 }127 while(b[0]&&!b[b[0]]) b[0]--;128 e[0]++;129 for(int i=1;i<=b[0];i++) {130 e[i]+=b[i];131 if(e[i]>=10) {132 e[i+1]+=e[i]/10;133 e[i]%=10;134 }135 }136 while(e[0]&&!e[e[0]]) e[0]--;137 }138 139 int main() {140 scanf("%s",s);141 int len=strlen(s);142 n[0]=len;143 for(int i=1;i<=len;i++) n[i]=s[len-i]-48;144 int _len=len/3+1;//因为有p^3 145 a[0]=_len;146 a[_len]=0;147 _w=_len;148 while(true) {149 if(!judge()) {150 a[_w]--;151 check();152 _w--;153 if(_w==0) break;154 a[_w]=1;155 }156 else _pluss();157 memset(e,0,sizeof e);158 __mul();159 _mul();160 pluss();161 }162 for(int i=a[0];i>=1;i--) printf("%d",a[i]);163 return 0;164 }
阅读全文
0 0
- VIjos 大整数(超级恶心的高精)
- 超级恶心的MSN
- 超级恶心的联想!!!!!!
- 超级大整数相乘
- 超级恶心
- 西行寺幽幽子(恶心的高精除)
- 大整数因子(高精mod)
- wawawawa超级恶心模拟
- 超级恶心的大批量数据导出到Excel
- 超级恶心的大批量数据导出到Excel
- Vijos 黑皮的正方形 (找规律+高精)
- vijos-1447 开关灯泡-大整数开方算法
- VIJOS P1617 超级教主
- 上机题目(中级)- 两个超级大的整数相加相减 (Java)
- 微软编辑器的代码高亮 (恶心模拟)
- 遭遇IT大恶心!!!!
- 各大BBS上恶心的100条变态笑话
- MySQL的新版JDBC驱动(5.1.7)一个超级恶心的问题
- LeetCode题解 第六周
- Vijos 约瑟夫问题10E100版 (又是找规律+高精)
- IntelliJ Idea 2017 免费激活方法
- vijos 隐形的翅膀
- Vijos 包裹快递(二分)
- VIjos 大整数(超级恶心的高精)
- Vijos 瑞士轮
- Vijos 八数码问题
- / Vijos 火柴棒等式
- / Vijos FBI树 递归
- 将数字转换为罗马数字(Integer to Roman)
- 洛谷 P1608 路径统计
- 微信抢票应用-个人总结
- Vijos 有根树的同构问题【字符串---最小表示法】