大数排序+大数相加+大数相乘

本文介绍了在常规数据类型无法满足需求时,如何使用字符数组或字符串处理大数的排序、加法及乘法运算。通过具体实例展示了不同运算的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们通常遇到的数的计算中,往往范围比较小,int、long、long long等就可以满足,但是在一些题目或者特殊情况时,我们遇到的数位数很长,基本的一些数据类型显然不满足,所有采用字符型数组输入这个数字,进行一些计算。(char [] 或者string;注意:char[]结尾一定要有'\0'字符)。下面通过三个例题介绍一些大数的相关操作。

1、大数排序

我们可以利用输入字符串的长度对这些数进行比较,当遇到长度相等的字符,可以直接比较这两个字符串,即比较他们的ASCII码值。

例:对N个长度最长可达到1000的数进行排序。

参考代码:

#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
static bool comp(string str1, string str2){//升序排序 
	if(str1.length() < str2.length()){
		return true;
	}
	if(str1.length() > str2.length()){
		return false;
	}
	if(str1.length() == str2.length()){
		return str1 < str2;
	}
	return false;
}
int main(){
	int i, n;	
	while(cin >> n){
		//设置为局部变量 
		vector<string> vc(n,""); 
		for(i = 0; i < n; i ++)
			cin >> vc[i];
			
		sort(vc.begin(), vc.end(), comp);
		
		for(i = 0; i < n; i ++)
			cout << vc[i] << endl;
			
	}
	return 0;
} 

2、大数的运算,我们可以采用数组进行计算。注意每一位进行计算时,如何进位即可,最后要注意计算的结果数组一般都会倒序输出。

加法:对于输入长度不等的两个大数,我们可以先做一个处理:长度一致处理,将两个字符长度处理为一样的,然后按位进行计算,最后将输出结果用reverse()函数逆置过来即可。

例题:请设计一个算法完成两个超长正整数的加法。

参考代码:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

string AddLengthInteger(string addend, string augend){
	int len1 = addend.length(), len2 = augend.length();
	int maxlen = max(len1, len2);
	//处理长度一至即可,补0操作 
	for(int i = maxlen - len1 - 1; i >= 0; i --){
		addend = '0' + addend;
	} 
	for(int i = maxlen - len2 - 1; i >= 0; i --){
		augend = '0' + augend;
	} 
	int carry = 0;
	string result = "";
	int temp; 
	for(int j = maxlen - 1; j >= 0; j --){
		temp = (addend[j] - '0') + (augend[j] - '0') + carry;
		result += char((temp % 10) + '0'); 
		carry = temp / 10;
	}
	if(carry == 1){
		result = '1' + result;
	}
	reverse(result.begin(), result.end());
	return result;
}
int main(){
	string str1, str2;
	while(cin >> str1 >> str2){
		cout << AddLengthInteger(str1, str2) << endl;
	} 
	return 0;
} 

乘法:用一个结果数组存储结果,其思路就是一个数的每一位都要和和另一个数的所有位都做*运算,将结果存在结果数组的对应位置,结果数组除了首尾,其他位在每一次计算时都可能加一个新的值。其实就是实现了你在草稿纸上计算两个数积的过程。

例题:两个长度小于 100 位的正整数,求其乘积。(输入一个n,表示输入的测试数据的组数)

参考代码:

#include<iostream>
#include<cstring>
using namespace std;
void mul(string str1, string str2){
	int a[105] = {0}, b[105] = {0}, result[205] = {0};
	int len1 = str1.size(), len2 = str2.size();
	int i, j;
	for(i = 0; i < len1; i ++){
		a[i] = str1[len1 - i - 1] - '0';
	}
	for(i = 0; i < len2; i ++){
		b[i] = str2[len2 - i - 1] - '0';
	}
	int temp, carry = 0, k = 0;
	for(i = 0; i < len1; i ++){
		for(j = 0; j < len2; j ++){
			temp = a[i] * b[j];
			result[i + j] += temp;
			k = i + j;
			while(result[k] >= 10){
				result[k + 1] += result[k] / 10;
				result[k] %= 10;
				k ++;
			}		
		}
	}
	for(int i = k; i >= 0; i --){
		cout << result[i];
	}
	cout << endl;
}
int main(){
	int n;
	string num1, num2;
	cin >> n;
	while(n --){
		cin >> num1 >> num2;
		mul(num1, num2);	
	}
	return 0;
} 


以上就是这篇的主要内容,欢迎您提出建议,让我们一同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值