首页 > 其他分享 >【开源】int,long long去一边去:高精度大合集!

【开源】int,long long去一边去:高精度大合集!

时间:2023-11-23 16:45:25浏览次数:36  
标签:string num2 int long 开源 vector result num1

加法 \(add\)

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

标签:string,num2,int,long,开源,vector,result,num1
From: https://www.cnblogs.com/daiyulong/p/kaiyuan-gaojingdu.html

相关文章

  • 【学到一个新名词】String interning(字符串驻留/字符串内部化)
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯在阅读VictoriaMetricsv1.95.1的命令行手册的时候,发现这样一段:-internStringCacheExpireDurationdurationTheexpirydurationforcachesforinterned......
  • Firefox developer tools truncates long network response, Chrome does not show
    Firefoxdevelopertoolstruncateslongnetworkresponse,ChromedoesnotshowFirefoxdevtoolsnetworkinspectorstilltruncatesresponsesto1MBbydefault.Youcanchangeordisablethelimitbynavigatingtoabout:configandchangingdevtools.netmonit......
  • uniapp开发[Vue warn]: Unhandled error during execution of scheduler flush. This
    如下,uniapp开发nvue页面报如下警告:15:30:25.079[Vuewarn]:Unhandlederrorduringexecutionofrenderfunctionat<UniGroupclass="w710cell_groupbg_whiteborder_radius16flex_row"top="10">at<Index__pageId=1__pagePath="pages/g......
  • 快手视频作品评论区提取工具,可采集UID,真实ID,评论内容开源版!基础代码
    之前给客户定制了一个提取视频评论区用户数据的功能,这个就是POST抓包解密形式的,所以都是公开的的,网页端提取,输入视频链接导入COOKIE【浏览器F12可提取COOKIE】就能自动提取作品下的所有评论内容用户di等信息,我这边直接把所有源码都分享出来。设计界面:  COOKIE输入:【浏览器F......
  • 解决python运行报错Hint: make sure your test modules/packages have valid Python n
    解决方案:在pycharm中的Terminal中运行:pip3install-ihttps://pypi.tuna.tsinghua.edu.cn/simple-rrequirements.txt问题解决优秀不够,你是否无可替代欢迎关注我的微信公众号:软件测试君......
  • Lebesgue Measure and Lebesgue integral
    Citation:Lee,JeongHwan,"MEASUREANDINTEGRATION"(2021).ElectronicTheses,Projects,andDissertations.1375.MeasureandIntegralareimportantwhendealingwithabstractspacessuchasfunctionspacesandprobabilityspaces.Measureand......
  • 【Android R】manualTests#com.android.cts.verifier.security.FingerprintBoundKeysT
    异常日志:11-1219:24:47.64953875387DAndroidRuntime:ShuttingdownVM11-1219:24:47.67153875387EAndroidRuntime:FATALEXCEPTION:main11-1219:24:47.67153875387EAndroidRuntime:Process:com.android.cts.verifier,PID:538711-1219:24:47.6715387......
  • 开源推荐,灵活多变功能强大的CMDB
    一个完善的基础资源数据库是我们构建运维自动化上层应用的基础,所以构建CMDB系统成了有想法在DevOps运维自动化领域有所发展的企业离不开的重要一环,但受制于每家企业不同的内外部环境、资源配置以及管理方式各不相同,开发一套相对通用的CMDB系统就变得非常困难,这也是为什么现在市面......
  • Oracle Hint(提示)之MERGE
    MERGE提示的作用和使用方法MERGE提示是指导优化器,合并查询中的视图。出现在from子句中的子查询,也被视为视图。MERGE提示的使用语法如下图所示:其中:tablespec表示目标表的名称或别名(当有别名时,必须用别名)。但不要加入表的属主(SCHEMA)名,哪怕在SQL中,明确写了属主,提示中也不能写。querybl......
  • 想基于AI变现吗,这个Star有1.8K的开源项目分享给你
    前言在如今AI爆发的时代,每个人都想借着AI这股风,进行变现,今天给大家分享一个开源项目,他可以让你基于AI的能力进行变现项目介绍这个项目在Github有1.8k个star,可见其欢迎程度,作者关注这个项目的时候,名称还为chatgpt-web-java,现在已经更名为aibeehive这个项目主要功能是对接了各......