基本算法之高精度计算c/c++实现

高精度计算

数据的接收和存储方法

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

松桥爸(仁勇)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值