高精度运算总结
高精度加法
题目链接
- 思想:
- 存进字符串,int数组保存各位
- 两数组相同位数直接加
- 将每一位数字向前进位(因为直接加结果会超过10)
- 代码:
#include<iostream>
#include<string.h>
using namespace std;
int a[505],b[505],c[505];
void init(int n[]){
string s;
cin>>s;
n[0] = s.length();
for(int i = 1;i <= n[0];i++){
n[i] = s[n[0]-i] -'0';
}
}
void plusxy(int * x,int *y){
if(x[0]>y[0])c[0]=x[0];
else c[0]=y[0];
for (int i = 1;i <= c[0];i++){
c[i] = a[i]+b[i];
}
}
void carry(int * n){
for(int i = 1;i <= n[0];i++){
if(n[i]/10 == 1){
n[i+1]++;
n[i]=n[i]%10;
}
}
if(n[n[0]+1])
n[0]++;
}
void output(int * n){
for(int i=n[0];i>=1;i--){
cout<<n[i];
}
}
int main(){
init(a);
init(b);
plusxy(a,b);
carry(c);
output(c);
return 0;
}
- 错误:
- 有区别好c和c++,将s定义为字符数组类型,无法调用length()函数
高精度乘法
题目链接
- 思想:
- 相同方法储存
- 模拟实际方法,该位与两个相乘后结果和上一位有关
- 每一位数字向前进位
- 代码:
#include<iostream>
#include<string.h>
using namespace std;
int a[2005],b[2005],c[4050];
void init(int n[]){
string s;
cin>>s;
n[0] = s.length();
for(int i = 1;i <= n[0];i++){
n[i] = s[n[0]-i] -'0';
}
}
void multiply(int * x,int *y){
for (int i = 1;i <= x[0];i++){
for(int j = 1;j <= y[0];j++){
c[i+j-1] += x[i]*y[j];
c[i+j] += c[i+j-1]/10;
c[i+j-1] %= 10;
}
}
}
void carry(int * n){
int len = a[0]+b[0];
while(c[len]==0&&len>1)len--;
c[0] = len;
}
void output(int * n){
for(int i=n[0];i>=1;i--){
cout<<n[i];
}
}
int main(){
init(a);
init(b);
multiply(a,b);
carry(c);
output(c);
return 0;
}
- 错误:
- 注意自己是正序还是逆序储存的数字,解题时耽误了较长时间
- 对于本题函数作用单一且定义了全局数组,有的没必要定义参数。
- 确定解法思路时,对于乘法的方法没有实际列出来,不然可以节省很多看题解学习思路的时间
高精度除法(高精度除单精度)
题目链接
- 思想:
- 相同方法储存(明确正序逆序)
- 相位相除,余数*10进入下一位,更新商
- 逐位进位
- 代码:
#include<iostream>
#include<string.h>
using namespace std;
int a[5005],b;
void output();
void init(){
string s;
cin>>s;
a[0] = s.length();
for(int i = 1;i <= a[0];i++){
a[i] = s[i-1] -'0';
}
}
void division(int * x,int y){
int i;
for (i = 1;i <= x[0];i++){
x[i+1] += (x[i]%y)*10;
x[i] /= y;
}
}
void carry(){
for(int i = a[a[0]];i > 1;i--){
a[i-1] += a[i]/10;
a[i] %=10;
}
}
void output(){
int i = 1;
while(a[i]==0&&i<a[0])i++;
for(;i<=a[0];i++){
cout<<a[i];
}
}
int main(){
init();
cin>>b;
division(a,b);
carry();
output();
return 0;
}
- 错误:
- 改变了储存顺序,没考虑到字符串起点是1,而我的int数组第一个元素存了位数。
吐了,在这卡了好久 - 题外话:java大整数真香 附个模板