您的位置:首页 > 编程语言 > C语言/C++

C++中的大数运算

2013-03-22 12:36 585 查看
1.大数相加

思路:

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

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

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

#define N 1000

//将c
中字符串转化成数字存入arr

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
;
int b
;
int sum[N+1];
//字符数组初始化为空,下面strlen(c)的值为0
char c
;

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
中字符串转化成数字存入arr

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;
}


运行结果如下:



待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: