数据结构与算法学习笔记(一)——高精度计算

由于在cpp程序中大整数运算存在数据溢出的问题(py可以进行大整数的精确计算),可以利用字符串进行大整数的精确计算并且打印。

以下是学习过程中解决问题的代码

//mycalculate.h
#pragma once
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Mycalculate {
public:
	//双高
	void add();
	void minus();
	void multiply();
	//一高一低
	void devide();
	void strtoint(string scr, int ns[]);
private:
};
//mycalculate.cpp
#include"mycalculate.h"
// str -> int
void Mycalculate::strtoint(string scr, int ns[]) {
	for (int i = 0; i < scr.size(); i++) {
		ns[scr.size() - i] = scr[i] - '0';
	}
}
//add
void Mycalculate::add() {
	string ns1, ns2;
	cin >> ns1 >> ns2;
	int n1[101]{ 0 }, n2[101]{ 0 }, n3[101]{ 0 };
	int len = max(ns1.size(), ns2.size());
	strtoint(ns1,n1);
	strtoint(ns2, n2);
	for (int i = 1; i <= len; i++) {
		n3[i] = n1[i] + n2[i] + n3[i];
		n3[i + 1] += n3[i] / 10;
		n3[i] = n3[i] % 10;
	}
	int j = len;
	while (n3[j] == 0) j--;
	while (j > 0) {
		cout << n3[j];
		j--;
	}
}
//minus
void Mycalculate::minus() {
	string ns1, ns2;
	cin >> ns1 >> ns2;
	int n1[101]{ 0 }, n2[101]{ 0 }, n3[101]{ 0 };
	strtoint(ns1, n1);
	strtoint(ns2, n2);
	int dig = 1;
	int i = 0;
	if (ns1.size() < ns2.size() || (ns1.size() == ns2.size() && ns1 < ns2)) {
		dig = 0;
	}
	if (dig) {
		int len = ns1.size();
		for (int i = 1; i <= len; i++) {
			n3[i] = n1[i] - n2[i] + 10 + n3[i];
			n3[i + 1] += (n3[i] / 10 - 1);
			n3[i] = n3[i] % 10;
		}
		i = len;
	}
	else {
		int len = ns2.size();
		for (int i = 1; i <= len; i++) {
			n3[i] = n2[i] - n1[i] + 10 + n3[i];
			n3[i + 1] += (n3[i] / 10 - 1);
			n3[i] = n3[i] % 10;
		}
		i = len;
		cout << '-';
	}
	//去除高位0
	while (n3[i] == 0) i--;
	while (i > 0) {
		cout << n3[i];
		i--;
	}
}
//multiply
void Mycalculate::multiply() {
	string ns1, ns2;
	cin >> ns1 >> ns2;
	int n1[101]{ 0 }, n2[101]{ 0 }, n3[101]{ 0 };
	strtoint(ns1, n1);
	strtoint(ns2, n2);
	int len1 = ns1.size(), len2 = ns2.size();
	for (int i = 1; i <= len1; i++) {
		for (int j = 1; j <= len2; j++) {
			int temp = 0;
			temp = n1[i] * n2[j] + n3[i + j - 1];
			n3[i + j] = n3[i + j] + temp / 10;
			n3[i + j - 1] = temp % 10;
		}
	}
	int i = len1 + len2;
	//去除高位0
	while (n3[i] == 0) i--;
	while (i > 0) {
		cout << n3[i];
		i--;
	}
}
//devide
void Mycalculate::devide() {
	string ns1;
	int n1[101]{ 0 }, n3[101]{ 0 };
	cin >> ns1;
	strtoint(ns1, n1);
	long long n2;
	cin >> n2;
	int len = ns1.size();
	for (int i = 1; i <= len; i++) {
		n3[i + 1] += ((n1[i] + n3[i]) % n2) * 10;
		n3[i] = (n1[i] + n3[i]) / n2;
	}
	int i = 1;
	//去除高位0
	while (n3[i] == 0) i++;
	if (i == len + 1) cout << 0;
	while (i < len + 1) {
		cout << n3[i];
		i++;
	}
	cout << "----余数为" << n3[i] / 10;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值