线性表- 大整数操作
来源:互联网 发布:苹果5如何用移动4g网络 编辑:程序博客网 时间:2024/05/22 12:18
对于大整数/多项式的操作,我们往往的实现手段都是把其封装成一个类,在其中定义对它的操作。
- 数据组织 可以用字符串的形式读入,然后转换成数组。
- 必要的时候可以进行倒置
- 计算操作的时候常常运用 &/ % / /
POJ十进制数转二进制数
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1008;char s[N];struct Tbign{ int len, a[N]; Tbign() { len = 0; memset(a, 0, sizeof(a)); } void read() { scanf("%s", s + 1); len = strlen(s + 1); for (int i = 1; i <= len; i++) a[i] = s[len - i + 1] - '0'; while (len > 1 && !a[len]) len--; } void write() { for (int i = len; i >= 1; i--) printf("%d", a[i]); printf("\n"); } Tbign operator / (const int x) const { Tbign c; int cur = 0; c.len = len; for (int i = len; i >= 1; i--) { cur = cur * 10 + a[i]; c.a[i] = cur / x; cur %= x; } while (c.len > 1 && !c.a[c.len]) c.len--; return c; }}A, B;int main(){#ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);#endif A.read(); while (A.len && A.a[A.len]) { B.a[++B.len] = A.a[1] & 1; A = A / 2; } B.write();#ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout);#endif return 0;}
写一版完整的封装到类的大整数操作
注意点:
- C.len A.len len 不要弄错了 如果觉得易错 那么就在外面分开用A、B写
- 乘法长度回变为原来的两倍 数组大小不要开小了
- 字符串到数字 要-‘0’
- 是+= 不是= 的时候注意
#include <iostream>#include <string.h>using namespace std;const int N = 405;const int pp = 10;struct Tbign{ int len; int num[N]; char s[N]; Tbign() { memset(num,0,sizeof(num)); len = 1; } void Read() { scanf("%s",s); len = strlen(s); for(int i = 1; i <= len; i++) num[i] = s[len - i] - '0'; } void Write() { for(int i = len; i > 0; i--) printf("%d",num[i]); printf("\n"); }}A,B,C;Tbign operator + (const Tbign &A, const Tbign & B){ Tbign C; C.len = max(A.len, B.len); for(int i = 1; i <= C.len; i++) { C.num[i] += A.num[i] + B.num[i]; C.num[i+1] += C.num[i] /pp; C.num[i] %= pp; } if(C.num[C.len+1]) C.len++; return C;}Tbign operator - (const Tbign &A, const Tbign &B){ Tbign C; C.len = A.len; for(int i = 1; i <= C.len;i++) { C.num[i] += A.num[i] - B.num[i]; if(C.num[i] < 0) C.num[i] += pp, C.num[i+1]--; } while(C.num[C.len] == 0 && C.len > 1) C.len--; return C;}Tbign operator * (const Tbign &A, const Tbign &B){ Tbign C; C.len = A.len + B.len - 1; //printf("C.len:%d",C.len); for(int i = 1; i <= A.len; i++) { for(int j = 1; j <= B.len; j++) { C.num[i+j-1] += A.num[i] * B.num[j]; C.num[i+j] += C.num[i+j-1]/pp; C.num[i+j-1] %= pp; } } if(C.num[C.len+1]) C.len++; while(C.num[C.len] == 0 && C.len > 1) C.len--; //printf("C.len:%d",C.len); return C;}Tbign operator /(const Tbign & A,const int x){ Tbign C; int cur = 0; C.len = A.len; for(int i = C.len; i > 0; i--) { cur = cur*pp + A.num[i]; C.num[i] = cur / x; cur %= x; } while(C.num[C.len] == 0 && C.len > 1) C.len--; return C;}int main(){#ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);#endif A.Read(); B.Read(); C = A * B; C.Write(); Tbign D; //D = A/2; //D.Write(); return 0;#ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout);#endif}
阅读全文
0 0
- 线性表- 大整数操作
- 线性表之大整数求和
- 大整数操作
- C++大整数相关操作
- BigDecimal类+大整数操作
- Java中的大整数操作
- 数据结构与算法MOOC / 第2周 线性表(Linear Lists3:大整数乘法
- 线性表-大整数乘法(数据结构基础 第2周)
- 大爱线性表
- 基于C++的大整数运算操作
- 【线性扫描+高精度】大整数除以小整数求余数,十进制除法
- 线性表操作
- 线性表操作
- 数据结构--线性表操作
- 线性表的操作
- C++线性表操作
- 线性表操作
- C++线性表操作
- project euler 20 Factorial digit sum
- [Err] 1064
- 留言板管理界面
- 写在前面的话
- FPGA较传统CPU强在哪里?
- 线性表- 大整数操作
- iOS开发者的大前端感悟:向前端说对不起
- Eclipse启动Web项目 Tomcat中webapps中没有项目文件夹
- 雅虎军规前端35条优化(css部分 js部分 图片 cookie 移动端 服务器)
- 数字是否在枚举中已经被定义
- ShapeDrawable使用记录
- 选择排序
- 绘制决策树
- 90后“老头儿”和00后Go小子的硬盘夜话