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; }
待续。。。