高精度计算
数据的接收和存储方法
void init(int a[]){
string s;
cin >> s;
len = s.length();
for(int i = 1; i <= length; i++){
a[i] = s[len-i] - ‘0’; //将字符串s转换成数组a,并倒序存储
}
}
高精度数位数的确定
接收时往往是用字符串的,所以它的位数就等于字符串的长度。
加法进位
c[i] = a[i] + b[i]
if(c[i]>10) { c[i] %= 10; ++c[i+1];}
减法借位
if(a[i] < b[i]) {- -a[i+1]; a[i] += 10;}
c[i] = a[i] - b[i];
乘法进位
i和j从1开始循环
c[i+j-1] = a[i] * b[i] + x + c[i+j-1];// 当前乘积 + 进位 + 原数
x = c[i+j-1] / 10;//记录 进位
c[i+j-1] = c[i+j-1] % 10;
除法(商和余数的求法)
商和余数的处理,视被除数和除数的位数情况进行处理。
高精度除以低精度:两种方法
方法一: 存储高精度数组可以保留多位数,可以减少很多操作次数
比如:
1234567891 ÷ 45 = 1’2345’6789 ÷ 45 = 274’3484
∵ 1/45=0, 1%45=1
∴取12345/45=274 ∵12345%45=15
∴取156789/45=3484
∴答案为2743484,余数为156789%45=9
//高精度除以低精度
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
char a1[101];
int a[101],c[101],b,lena,i,j,x,lenc;
int l = 4;
int main(){
gets(a1);
cin >> b ;
lena = strlen(a1);
int y = 1;
int k = (lena / 4) + 1;
for(i = lena - 1,j = 0; i >= 0; i--) {
a[k] = y * (a1[i] - 48) + a[k];//存储高精度数组可以保留多位数
y *= 10;
j++;
if(j % 4 == 0){
k--;
y = 1;
}
}
lena = (lena / 4) + 1;
for(i = 1; i <= lena; i++){
c[i] = (x*10000 + a[i]) / b;
x = (x*10000 + a[i]) % b;
}
lenc = 1;
while(c[lenc] == 0 && lenc <= lena) lenc++;
for(i = lenc; i <= lena; i++)
cout << c[i];
cout << endl;
return 0;
}
方法二: 改进方法一,思路同上
//高精度除以低精度
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
string a1;
int a[101],c[101],b,lena,i,j,x,lenc;
int l = 4;
bool allisnum(string str){//判断输入串是否是数字串
int strl = str.length();
for(i = 0; i < strl ; i++){
int temp = (int)str[i];
if(temp < 48 || temp > 57) return false;
}
return true;
}
int main(){
//方法1
cin >> a1;
while(!allisnum(a1)){
cout << "请输入数字串:";
cin >> a1;
}
cin >> b ;
lena = a1.length();
int k = (lena / l) + 1;
for(i = 1; i <= k; i++){
if(lena >= 4) lena-=4;
else l = lena,lena = 0;
a[k-i+1] = atoi(a1.substr(lena,l).c_str());
}
for(i = 1; i <= k; i++){
c[i] = (x*10000+ a[i]) / b;
x = (x*10000 + a[i]) % b;
}
lenc = 1;
while(c[lenc] == 0) lenc++;
for(i = lenc; i <= k; i++)
cout << c[i];
cout << endl;
return 0;
}