高精度模板
来源:互联网 发布:软件公司员工保密协议 编辑:程序博客网 时间:2024/05/22 01:34
一.大整数结构体
struct BigInter{ int num[1001];};
二.输入函数
BigInter get(){ BigInter A; memset(A.num,0,sizeof(A.num));//初始化为0 char s[10001];//注意使用时要根据实际情况来改变数组s的大小 scanf("%s",s);//输入 A.num[0] = strlen(s);//num[0]储存大整数的位数 for(int i = 1; i <= A.num[0]; i++)//将字符串转化为数字 A.num[i] = s[A.num[0] - i] - 48; return A;//返回}
三.输出函数
void print(BigInter A){ if(A.num[0] == 0)//特判为0的情况 { printf("0\n"); return; } for(int i = A.num[0]; i >= 1; i--)//逆序输出 printf("%d",A.num[i]); printf("\n"); return;}
四.比较函数
int compare(BigInter A,BigInter B)//A大于B,返回1;A等于B,返回0;A小于B,返回-1{ if(A.num[0] > B.num[0])//先比较位数 return 1; if(A.num[0] < B.num[0]) return -1; for(int i = A.num[0]; i >= 1; i--)//如果位数相同,逆序比较每一位 { if(A.num[i] > B.num[i]) return 1; if(A.num[i] < B.num[i]) return -1; } return 0;//相等}
五.加法
BigInter add(BigInter A,BigInter B){ BigInter C; memset(C.num,0,sizeof(C.num));//初始化为0 if(A.num[0] < B.num[0])//C.num[0]记录A,B中较大的位数 C.num[0] = B.num[0]; else C.num[0] = A.num[0]; for(int i = 1; i <= C.num[0]; i++) C.num[i] += A.num[i] + B.num[i];//对应的每位相加 for(int i = 1; i <= C.num[0]; i++)//处理进位 { C.num[i + 1] = C.num[i + 1] + C.num[i] / 10; C.num[i] = C.num[i] % 10; } if(C.num[C.num[0] + 1] > 0)//修正位数 C.num[0]++; return C;//返回}
六.减法
BigInter subtract(BigInter A,BigInter B){ int comp = compare(A,B);//比较结果 if(comp == 0)//如果相等 { A.num[0] = 0;//将位数赋为0,输出函数会为我们特判,然后输出0 return A; } else if(comp == 1)//如果A大于B { for(int i = 1; i <= A.num[0]; i++)//循环A的位数次 { if(A.num[i] < B.num[i])//如果当前位A小于B { A.num[i + 1]--;//就从高位借1 A.num[i] = A.num[i] + 10; } A.num[i] = A.num[i] - B.num[i];//用A减去B,结果保存在A数组(大减小) } while(A.num[A.num[0]] == 0)//修正位数 A.num[0]--; return A;//返回 } else if(comp == -1)//如果A小于B { printf("-");//先打印一个负号 for(int i = 1; i <= B.num[0]; i++)//循环B的位数次 { if(B.num[i] < A.num[i])//如果当前位B小于A { B.num[i + 1]--;//就从高位借1 B.num[i] = B.num[i] + 10; } A.num[i] = B.num[i] - A.num[i];//用B减去A,结果保存在A数组(大减小) } A.num[0] = B.num[0];//将B的位数赋给A while(A.num[A.num[0]] == 0)//修正位数 A.num[0]--; return A;//返回 }}
七.乘法
BigInter Multiply(BigInter A,BigInter B){ BigInter C;//局部变量 memset(C.num,0,sizeof(C.num));//初始化为0,非常重要! C.num[0] = A.num[0] + B.num[0];//计算位数 for(int i = 1; i <= A.num[0]; i++)//模拟两数相乘的计算过程 for(int j = 1; j <= B.num[0]; j++) C.num[i + j - 1] += A.num[i] * B.num[j]; for(int i = 1;i <= C.num[0]; i++)//处理进位 { C.num[i + 1] += C.num[i] / 10; C.num[i] %= 10; } while(C.num[0] > 0 && C.num[C.num[0]] == 0)//修正位数 C.num[0]--; return C;}
PS:可以轻松地转换为R进制高精度
若定义为局部变量,那么一定别忘了初始化
阅读全文
1 0
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 【模板】高精度
- 高精度模板
- 高精度模板
- 利用FFTW3生成图像频谱模板
- 理解SetCapture、ReleaseCapture、GetCapture(控制了消息发往哪个窗口,是理解消息的关键)
- 基于matlab/Simulink的参数辨识
- 使用redis实现一个购物车功能
- 接口回调
- 高精度模板
- 方向传感器
- HDU
- hdu 6148 Valley Numer 数位dp
- 实现安全组内网络隔离
- 关于IntelliJ IDEA的安装破解,只需要这一篇
- Xmind教程-添加外框
- 小区重选流程
- 联合训练赛6 A 相同的窗户(hash)