在我们通常遇到的数的计算中,往往范围比较小,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;
}
以上就是这篇的主要内容,欢迎您提出建议,让我们一同进步!