主要内容 #
- 高精度乘以单精度例题精讲
- 高精度乘以高精度例题精讲
1. 高精度乘以单精度例题精讲 #
1.1 计算过程 #
这种乘法运算与高精度加法类似,所不同的是,对于高精度数字由低位到高位逐位乘以单精度数。设高精度的数位数字为a[i],单精度数为b,则可以把a[i]*b除以进制的余数作为更新a[i]的值,把其商数作为进位。过程如下:
1.接收输入的高精度的字符串a:用string接收正整数的数字串;
2.从低位往高位存放到数组a,单精度整数b用int型存储;
3.重点:将两个数进行相乘,计算相乘的过程中,同时处理进位
注意:刚开始时,进位x=0;同时要注意最高位的进位,不要漏了。
1.2 例题 #
求10000以内n的阶乘。
输入:
只有一行输入,整数n(0<= n <= 10000)。
输出:
一行,即n!的值。
样例输入:
100
样例输出:
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
参考程序
#include < iostream >
#include < string >
using namespace std;
int a[40010], n, x, len = 1;
int main(){
cin >> n;
//初始化为1
a[1] = 1;
for(int i = 1; i <= n; ++i){
x = 0;
//len 表示当前整数的长度
for(int j = 1; j <= len; ++j){
a[j] = a[j] * i + x;
//x 表示处理上一位的进位
x = a[j] / 10;
a[j] = a[j] % 10;
//判断进位后整数的长度是够增加
if(x > 0 && j >= len) len++;
}
}
//逆序输出
for(int i = len; i >= 1; i--) cout << a[i];
cout << endl;
return 0;
}
2. 高精度乘以高精度例题精讲 #
2.1 计算过程 #
1.接收输入的两个大整数的数字串:用string接收两个正整数的数字串(C用字符数组或字符指针);
2.从低位往高位存放到数组a和b中;
3.重点:将两个数进行相乘:
计算相乘的过程中,可以先不考虑进位,后面再处理进位
(1)先不考虑进位,先按竖式计算,求出各个位置相乘得到的数存到数组c中;
(2)然后,再处理进位,用求余。
2.2 例题 #
求两个不超过200位的非负整数的积。
输入:
有两行,每一行是不超过200位的非负整数。
输出:
一行,即两行数相乘的结果。
样例输入:
1234567
7654321
样例输出:
9449772114007
参考程序
#include < iostream >
#include < string >
using namespace std;
const int MAX = 100;
int toMul(int a[], int b[], int c[], int la, int lb);
int main(int argc, const char * argv[]) {
// 因为第一个数a的位数为len1,b的位数为:len2,所以c应为len1+len2+1
// 如:a,b位数最高为2位数,则最大为:99 * 99 < 100 * 100 = 10000
// 积的位数小于 2 + 2 + 1 = 5;
int a[MAX], b[MAX], c[2*MAX+1], i, la, lb, lc;
string str1, str2;
cout << "请输入两个高精度数(空格隔开):\n";
while(cin >> str1 >> str2) { // 1.输入两个大整数的数字串
cout << "这两个数之积是:\n";
memset(a, 0, sizeof(a)); // 清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
la = (int)str1.size();
lb = (int)str2.size();
// 2.将两个大整数从低位往高位存放到数组中
for(i = 0; i < la; i++)
a[la-i-1] = str1[i] - '0'; // '0'->48
for(i = 0; i < lb; i++)
b[lb-i-1] = str2[i] - 48; // 减去'0'或48都可以
// 3.c=a*b,求两个大整数的积
lc = toMul(a, b, c, la, lb);
// 4.输出结果:从高位往低位输出
for(i = 0; i < lc; i++)
cout << c[lc-i-1];
cout << endl;
cout << "请输入高精度数和一个整数(空格隔开):\n";
}
return 0;
}
// c=a*b,求两个大整数的积
int toMul(int a[], int b[], int c[], int la, int lb) {
int i, j, lc;
// 逐位相乘求出对应位置的数,先不考虑进位
for(i = 0; i < la; i++)
for(j = 0; j < lb; j++) {
c[i+j] = c[i+j] + a[i] * b[j];
}
lc = la + lb; // 积的最大长度
// 处理进位
for(i = 0; i < lc; i++) {
c[i+1] = c[i+1] + c[i] / 10; // 求进位,求出第i位向第i+1位的进位
c[i] = c[i] % 10;
}
while(lc > 1 && c[lc-1] == 0)
lc--;
return lc;
}