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;
}
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;
}
运行结果如下:
待续。。。