C++中的大数运算

1.大数相加

思路:

建立两个长度为N的整型数组分别存放两个大数,和一个长度为N+1的数组存放它们得和。

建立一个字符数组存放每次输入的大数(此时数组中存放的实际为字符,要将它们转化为int型后再传递给整型数组)

//实现两个大数相加
#include <iostream>
using namespace std;

#define N 1000

//将c[n]中字符串转化成数字存入arr[n]
void InitArray(int arr[],char c[],int n)//初始化数组
{
	int k = strlen(c);
	for (int i = 0;i < k;i++)//strlen(c)等于c中字符个数,不包括‘\0’
	{
		arr[n - k + i] = c[i] - '0';
	}
}
void PrintArray(int arr[],int n)//打印数组中的元素
{
	int k = 0;
	for (int i = 0;i < n;i++)
		if(arr[i] != 0)
		{
			k = i;
			break;
		}
	for (int i = k;i < n;i++)
		cout << arr[i];
}
void CulateSum(int arr1[],int arr2[],int sum[],int n)//由低位到高位计算两个大数的和,并把结果存入数组sum
{
	for (int i = n;i >= 1;i--)
	{
		//注意:数组sum比数组arr1和arr2多一位元素,用来存放进位
		sum[i] += arr1[i - 1] + arr2[i - 1];
		if(sum[i] >= 10)
		{
			sum[i] -= 10;//取个位
			sum[i-1] += 1;//进位
		}
	}
}

//在函数体外定义的数组,元素均初始化为零
int a[N];
int b[N];
int sum[N+1];
//字符数组初始化为空,下面strlen(c)的值为0
char c[N];

int main()
{
	cout << "input first number:" << endl;
	cin >> c;
	//对数组a进行初始化
	InitArray(a,c,N);
	//打印数组a中元素
	//PrintArray(a,sizeof(a)/sizeof(int));
	cout << "input second number:" << endl;
	cin.clear();
	cin >> c;
	//对数组b进行初始化
	InitArray(b,c,N);
	//打印数组b中元素
	//PrintArray(b,sizeof(b)/sizeof(int));

	//求sum
	CulateSum(a,b,sum,N);
	cout << "\nthe result is: " << endl;
	PrintArray(sum,sizeof(sum)/sizeof(int));
	cout << endl;

	return 0;
}


运行结果如下:
C++中的大数运算_第1张图片


2.大数相乘

思路:

建立两个字符数组分别存放两个大数,并将字符数组中的char元素转换为int型;

根据等式mResult[i+j] =mResult[i+j] + mult1[i]*mult2[j];求解;

代码如下:

#include <iostream>
using namespace std;

#define M 100

//将c[n]中字符串转化成数字存入arr[n]  
void InitArray(int arr[],char c[],int n)//初始化数组  
{  
	int k = strlen(c);  
	for (int i = 0;i < k;i++)//strlen(c)等于c中字符个数,不包括‘\0’  
	{  
		arr[n - k + i] = c[i] - '0';
	}  
}

void bigDataMultiply(char m1[],char m2[],int mResult[],int m1Length,int m2Length)
{
	int mult1[M];
	int mult2[M];
	//数组初始化
	InitArray(mult1,m1,m1Length);
	InitArray(mult2,m2,m2Length);
	memset(mResult,0,sizeof(int)*2*M);//注意:将指针mResult指向位置开始的前sizeof(int)*2*M个字节值为0
	//carry表示进位
	int carry = 0;
	//remainder表示余数
	int remainder = 0;

	for (int i = 0;i < m1Length;++i)
		for(int j = 0;j < m2Length;++j)
			mResult[i+j] =mResult[i+j] + mult1[i]*mult2[j];
	//处理进位
	for (int i = 0;i < m1Length + m2Length;++i)
	{
		mResult[i] += carry;
		carry = mResult[i]/10;
		//若存在进位,则对mResult[i]求余
		int k = carry;
		while (k)
		{
			mResult[i] = mResult[i]%10;
			k /= 10;
		}
	}
}

//打印数组中的元素
template<class T>
void printArray(T arr[],int n)  
{
	int k = 0;
	for (int i = 0;i < n;i++)
	{
		if(arr[i] != 0)
		{
			k = i;
			break;
		}
	}
	for (int i = k;i < n;i++)
		cout << arr[i];
	cout << endl;
}

int main()
{
	char bigData1[M],bigData2[M];
	int resultData[2*M] = {0};

	cout << "输入两个大数:\n";
	while(cin >> bigData1 >> bigData2)
	{
		
		reverse(bigData1,bigData1+strlen(bigData1));
		reverse(bigData2,bigData2+strlen(bigData2));
		//printArray(bigData1,strlen(bigData1));
		//printArray(bigData2,strlen(bigData2));
		bigDataMultiply(bigData1,bigData2,resultData,strlen(bigData1),strlen(bigData2));
		reverse(resultData,resultData+sizeof(resultData)/sizeof(int));
		cout << "乘积为:\n";
		printArray(resultData,2*M);
		cout << "\n输入两个大数:\n";
	}

	return 0;
}

运行结果如下:

C++中的大数运算_第2张图片

待续。。。

你可能感兴趣的:(C++中的大数运算)