加法 \(add\)

string add(string s1, string s2) {    //时间复杂度 O(log n)
string res = "";
int c = 0, i = 0;
while (i<s1.size() || i < s2.size() || c>0) {
int a = (i<s1.size()) ? (s1[s1.size() - i - 1] - '0') : 0;
int b = (i<s2.size()) ? (s2[s2.size() - i - 1] - '0') : 0;
res += ((a + b + c) % 10) + '0';
c = (a + b + c) / 10;
i++;
}
reverse(res.begin(), res.end());
return res;
}

减法 \(sub\)

string sub(string a, string b) {	//时间复杂度 O(log n)
string res;
int c = 0;
if (a.size() < b.size()) a = string(b.size() - a.size(), '0') + a;
else if (a.size() > b.size()) b = string(a.size() - b.size(), '0') + b;
for (int i = a.size() - 1; i >= 0; i--) {
int d = a[i] - b[i] - c;
if (d < 0) d += 10, c = 1;
else c = 0;
res.push_back(d + '0');
}
reverse(res.begin(), res.end());
while (res.size() > 1 && res[0] == '0') {
res.erase(res.begin());
}
return res;
}

乘法 \(mul\)

string mul(string num1, string num2) {	//时间复杂度 O(n^2)
string res(int(num1.length()) + int(num2.length()), '0');
for (int i = int(num1.length()) - 1; i >= 0; i--) {
for (int j = int(num2.length()) - 1; j >= 0; j--) {
int pd = (num1[i] - '0') * (num2[j] - '0');
int p1 = i + j;
int p2 = i + j + 1;
int sum = pd + (res[p2] - '0');
res[p2] = sum % 10 + '0';
res[p1] += sum / 10;
}
}
int i = 0;
while (i<int(res.length()) && res[i] == '0') {
i++;
}
return i == int(res.length()) ? "0" : res.substr(i);
}
\[————————————————————————————————————————————————
\]
#include <iostream>
#include <vector>
using namespace std;
// 将字符串转换为整数数组
vector<int> strToVec(string str) {
vector<int> vec;
for (int i = str.length() - 1; i >= 0; i--) {
vec.push_back(str[i] - '0');
}
return vec;
}
// 将整数数组转换为字符串
string vecToStr(vector<int> vec) {
string str = "";
for (int i = vec.size() - 1; i >= 0; i--) {
str += to_string(vec[i]);
}
return str;
}
// 高精度加法
vector<int> add(vector<int> num1, vector<int> num2) {
vector<int> result;
int carry = 0;
int len1 = num1.size();
int len2 = num2.size();
int maxLen = max(len1, len2);
for (int i = 0; i < maxLen; i++) {
int digit1 = i < len1 ? num1[i] : 0;
int digit2 = i < len2 ? num2[i] : 0;
int sum = digit1 + digit2 + carry;
result.push_back(sum % 10);
carry = sum / 10;
}
if (carry != 0) {
result.push_back(carry);
}
return result;
}
// 高精度乘法
vector<int> mul(vector<int> num1, vector<int> num2) {
int len1 = num1.size();
int len2 = num2.size();
// 递归终止条件
if (len1 == 0 || len2 == 0) {
return vector<int>();
}
// 递归基
if (len1 == 1 && len2 == 1) {
vector<int> result;
int product = num1[0] * num2[0];
result.push_back(product % 10);
if (product >= 10) {
result.push_back(product / 10);
}
return result;
}
// 将数字分为两部分
int mid = min(len1, len2) / 2;
vector<int> num1Low(num1.begin(), num1.begin() + mid);
vector<int> num1High(num1.begin() + mid, num1.end());
vector<int> num2Low(num2.begin(), num2.begin() + mid);
vector<int> num2High(num2.begin() + mid, num2.end());
// 递归计算
vector<int> z0 = mul(num1Low, num2Low);
vector<int> z1 = mul(num1High, num2High);
vector<int> z2 = mul(add(num1Low, num1High), add(num2Low, num2High));
z2 = add(z2, z0);
z2 = add(z2, z1);
// 合并结果
vector<int> result;
result.insert(result.end(), z0.begin(), z0.end());
result.insert(result.begin() + mid, z2.begin(), z2.end());
result.insert(result.begin() + 2 * mid, z1.begin(), z1.end());
return result;
}
int main() {
string str1, str2;
cout << "请输入两个整数:" << endl;
cin >> str1 >> str2;
vector<int> num1 = strToVec(str1);
vector<int> num2 = strToVec(str2);
vector<int> result = mul(num1, num2);
string strResult = vecToStr(result);
cout << "两个整数的乘积为:" << endl;
cout << strResult << endl;
return 0;
}

除法&取余 \(divi\)

两个正数相除,商为\(quotient\),余数为\(residue\)

int compare(string str1, string str2) {
if (str1.length() > str2.length()) return 1;
else if (str1.length() < str2.length()) return -1;
else return str1.compare(str2);
}
string sub(string a, string b) { //时间复杂度 O(log n)
string res;
int c = 0;
if (a.size() < b.size()) a = string(b.size() - a.size(), '0') + a;
else if (a.size() > b.size()) b = string(a.size() - b.size(), '0') + b;
for (int i = a.size() - 1; i >= 0; i--) {
int d = a[i] - b[i] - c;
if (d < 0) d += 10, c = 1;
else c = 0;
res.push_back(d + '0');
}
reverse(res.begin(), res.end());
while (res.size() > 1 && res[0] == '0') {
res.erase(res.begin());
}
return res;
}
string mul(string num1, string num2) { //时间复杂度 O(n^2)
string res(int(num1.length()) + int(num2.length()), '0');
for (int i = int(num1.length()) - 1; i >= 0; i--) {
for (int j = int(num2.length()) - 1; j >= 0; j--) {
int pd = (num1[i] - '0') * (num2[j] - '0');
int p1 = i + j;
int p2 = i + j + 1;
int sum = pd + (res[p2] - '0');
res[p2] = sum % 10 + '0';
res[p1] += sum / 10;
}
}
int i = 0;
while (i<int(res.length()) && res[i] == '0') {
i++;
}
return i == int(res.length()) ? "0" : res.substr(i);
}
void divi(string str1, string str2, string& quotient, string& residue) {
quotient = residue = "";
if (str2 == "0") {
quotient = residue = "ERROR";
return;
}
if (str1 == "0") {
quotient = residue = "0";
return;
}
int res = compare(str1, str2);
if (res < 0) {
quotient = "0";
residue = str1;
return;
}
else if (res == 0) {
quotient = "1";
residue = "0";
return;
}
else {
int len1 = str1.length();
int len2 = str2.length();
string tempstr;
tempstr.append(str1, 0, len2 - 1);
for (int i = len2 - 1; i < len1; i++) {
tempstr = tempstr + str1[i];
tempstr.erase(0, tempstr.find_first_not_of('0'));
if (tempstr.empty()) tempstr = "0";
for (char ch = '9'; ch >= '0'; ch--) {
string str, tmp;
str = str + ch;
tmp = mul(str2, str);
if (compare(tmp, tempstr) <= 0) {
quotient = quotient + ch;
tempstr = sub(tempstr, tmp);
break;
}
}
}
residue = tempstr;
}
quotient.erase(0, quotient.find_first_not_of('0'));
if (quotient.empty()) quotient = "0";
}

【开源】int,long long去一边去:高精度大合集!的更多相关文章

  1. 直接拿来用!Facebook移动开源项目大合集

    直接拿来用!Facebook移动开源项目大合集 时间:2014-04-22 15:37 作者:唐小引 随着iOS依赖管理工具CocoaPods和大量第三方开源库成熟起来,业界积累了大量的优秀开源项目. ...

  2. TypeScript 优秀开源项目大合集

    TypeScript出来有段时间了,也冒出了很多用TypeScript开发的优秀开源项目,搜寻了一些基于TypeScript项目,分享给大家: https://github.com/brookshi/ ...

  3. 400多个开源项目以及43个优秀的Swift开源项目-Swift编程语言资料大合集

    Swift 基于C和Objective-C,是供iOS和OS X应用编程的全新语言,更加高效.现代.安全,可以提升应用性能,同时降低开发难度. Swift仍然处于beta测试的阶段,会在iOS 8发布 ...

  4. iOS开源项目教程大合集

    UI篇 1.MMDrawerController http://www.cnblogs.com/shangdahao/p/3142204.html 2.SVPullToRefresh http://w ...

  5. Tomcat 7 的七大新特性(更容易将Tomcat内嵌到应用去中去 )

    Tomcat的7引入了许多新功能,并对现有功能进行了增强.很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们,或指出它们的不足,或提供代码示例.本文将明确描述TOMCAT 7中七个最显 ...

  6. 最新最全的 Android 开源项目合集

    原文链接:https://github.com/opendigg/awesome-github-android-ui 在 Github 上做了一个很新的 Android 开发相关开源项目汇总,涉及到 ...

  7. 深度学习优质学习项目大放送!-AI Studio精选开源项目合集推荐

    近期 在AI Studio上发现了不少优质的开源深度学习项目,从深度学习入门到进阶,涵盖了CV.NLP.生成对抗网络.强化学习多个研究方向,还有最新的动态图,都以NoteBook的方式直接开源出来,并 ...

  8. 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!

    本篇合集包括以下三个部分的内容: 1.微软亚洲研究院过去一年的所有开源合集,如分布式机器学习工具包DMTK等. 2.利用微软研究院的技术提高工作效率的工具合集,如让没有机器学习背景的开发人员也能开发出 ...

  9. 超全的 Vue 开源项目合集,签收一下

    超全的 Vue 开源项目合集,签收一下 xiaoge2016 前端开发 1周前 作者:xiaoge2016 链接: https://my.oschina.net/u/3018050/blog/2049 ...

  10. 开源ckplayer 网页播放器去logo去广告去水印修改

    功能设置介绍 本教程涉及到以下各点,点击对应标题页面将直接滑动到相应内容: 1:修改或去掉播放器前置logo 2:修改或去掉右上角的logo 3:修改.关闭.设置滚动文字广告 4:去掉右边的开关灯分享 ...

随机推荐

  1. tensorflow.js 多分类,机器学习区分企鹅种类

    前言: 在规则编码中,我们常常会遇到需要通过多种区间判断某种物品分类.比如二手物品的定价,尽管不是新品没有 SKU 但是基本的参数是少不了.想通过成色来区分某种物品,其实主要是确定一些参数.然后根据参 ...

  2. Promise的理解与使用(一)

    一.Promise是什么?Promise是JS中进行异步操作的新的解决方案(旧的方案是回调函数的形式,回调函数里嵌套函数)从语法上来说,Promise是一个构造函数.从功能上来说,用Promise的实 ...

  3. [golang]gin框架接收websocket通信

    前言 WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都 ...

  4. Flutter 学习笔记(01)__从 0 开始创建一个 flutter 项目

    最近发现有不少的公司已经跳出 uniapp 的坑坑,开始使用 flutter 开发app了,为了让自己不失业,赶紧卷起来!此篇文章教你从 0 基础开发一个 简单页面,文章篇幅较长,建议收藏!也可以直接 ...

  5. salesforce零基础学习(一百三十)Report 学习进阶篇

    本篇参考: https://help.salesforce.com/s/articleView?id=sf.reports_summary_functions_about.htm&type=5 ...

  6. DDD 架构分层,MQ消息要放到那一层处理?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 本文的宗旨在于通过简单干净实践的方式教会读者,使用 Docker 配置 RocketMQ 并在 ...

  7. 三维模型OSGB格式轻量化纹理压缩关键技术分析

    三维模型OSGB格式轻量化纹理压缩关键技术分析 在三维模型应用中,纹理是一个十分重要的因素,可以使得模型更加真实.精细.随着移动设备和网络传输速度的限制,纹理数据也需要进行轻量化处理,而OSGB格式纹 ...

  8. AI绘画StableDiffusion美女实操教程:斗破苍穹-小医仙

    之前分享过StableDiffusion的入门到精通教程:AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通 但是还有人就问:安装是安装好了,可是为什么生成的图片和你生成的图片差距 ...

  9. LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  10. 【升职加薪秘籍】我在服务监控方面的实践(8)-elasticsearch 性能监控与分析手段

    大家好,我是蓝胖子,之前讲了mysql,redis中间件的监控,今天我们再来看看另一个基础组件elasticsearch,如何对它进行监控,当你思考如何对一个组件进行监控时,四大黄金指标会告诉你答案, ...