例题:9876543210*1234567890 的乘积
分析:正常的数据结构已经无法满足这么大的数相乘的结果。只能使用数组来进行操作。
1、两个数都用字符数组来接收。
2、接收后,因为每一位要乘以另一个数的每一位,
数组下标0的位置是数字的最高位,这样每次相乘后都会发生最高为变化。而下标0的位置不易变化。
需要将最低位的值转移到下标为0这个位置,将最高位的数组下标改成最大下标。
所以,需要将原来的两个数,进行取反。
3、两个数相乘,在每一位相乘的过程中,有可能大于10的乘积,需要进位。所以要判断相乘后的积是否大于10,大于10需要进位。
每一次进位,相乘,都需要跟原来下标位置的值,进行相加,才能获得最终的值
4、在输出前,需要对这个数进行位数确定。从后到前查看碰到字符为0的就赋值为‘\0’,字符串以0结尾。
5、因为乘积是反向的,所以输出的时候需要再次取反。将这个数反向打印出来即可。
#include <iostream>
using namespace std;
int main() {
char a[], b[], c[] = {};
int i, j, k, l, A, B, C;
//输入第一个数
cin >> a;
//查看第一个数的长度
for (i = ; a[i] != '\0';++i) { }
A = i;
//将第一个数,位置取反
for (i = ; i <= (A - ) / ;++i) {
k = a[i];
a[i] = a[A - i - ];
a[A - i - ] = k;
}
//输入第二个数
cin >> b;
//查看第二个数的长度
for (i = ; b[i] != '\0';++i) {}
B = i;
//将第二个数,位置取反
for (i = ; i <= (B - ) / ;++i) {
k = b[i];
b[i] = b[B - i - ];
b[B - i - ] = k;
}
//两数相乘
for (i = ; i <= A - ;++i) {
for (j = ; j <= B - ;++j) {
C=(a[i]-) * (b[j]-);
k = i + j;
c[k] = c[k] + C;
C = c[k];
for (l = ; c[k + l] >= ;++l) {
c[k+l] = c[k + l] % ;
c[k + l + ] = C / + c[k + l+];
C = c[k+l+];
}
}
} //输出相乘后的数
for (i = ; c[i] == ;i--) {
if (c[i]==) {
c[i] = '\0';
}
}
j = i + ;
for (i = ; i < (j - )/;++i) {
k = c[i];
c[i] = c[j-i - ];
c[j - i - ] = k;
}
for (i = ; i < j;++i) {
printf("%d",c[i]);
}
}