#define MAXLENGTH 1000
#include <stdio.h>
#include <string.h>
void compute(char *a, char *b, char *c);
void main(void)
{
char a[MAXLENGTH], b[MAXLENGTH], c[MAXLENGTH * 2];
puts("Input multiplier :");
gets(a);
puts("Input multiplicand :");
gets(b);
compute(a, b, c);
puts("Answer :");
puts(c);
getchar();
}
//下面都看不大懂,求大神详解
void compute(char *a, char *b, char *c)
{
int i, j, m, n;
long sum, carry;
m = strlen(a) - 1;
n = strlen(b) - 1;
for (i = m; i >= 0; i--)
a[i] -= '0';
for (i = n; i >= 0; i--)
b[i] -= '0';
c[m + n + 2] = '\0';
carry = 0;
for (i = m + n; i >= 0; i--)
{
sum = carry;
if ((j = i - m) < 0)
j = 0;
for ( ; j<=i && j<=n; j++)
sum += a[i-j] * b[j];
c[i + 1] = sum % 10 + '0';
carry = sum / 10;
}
if ((c[0] = carry+'0') == '0')
c[0] = '\040';
}
C语言编程求两个大数的乘积,帮忙看一个程序分析一下
答案:1 悬赏:40
解决时间 2021-03-22 12:19
- 提问者网友:余味
- 2021-03-22 02:17
最佳答案
- 二级知识专家网友:青灯壁纸妹
- 2021-03-22 03:14
void compute(char *a, char *b, char *c)
{
int i, j, m, n;
long sum, carry;
m = strlen(a) - 1;//第一个乘数的位数
n = strlen(b) - 1;//第二个成熟的位数
for (i = m; i >= 0; i--) a[i] -= '0'; //将数字字符转变成数
for (i = n; i >= 0; i--) b[i] -= '0'; //将数字字符转变成数
c[m + n + 2] = '\0'; //积的字符串末尾置0
carry = 0; //进位。下面是从个位起逐位计算每一位的数值,用的方法与人工列竖式计算完全一样
for (i = m + n; i >= 0; i--) //从积个位(最后面)到最高位(最前面)
{
sum = carry; //该位累加,先加上后面一位计算中的进位
if ((j = i - m) < 0) j = 0; //第i位的计算与第一个乘数中i位之前的各位没有关系
for ( ; j<=i && j<=n; j++) sum += a[i-j] * b[j]; //循环计算有关各位相乘的积并累加
c[i + 1] = sum % 10 + '0'; //计算累加结果的个位,就是当前位的值,+'0'转化成字符
carry = sum / 10; //计算结果除以10,是向前面一位的进位
}
if ((c[0] = carry+'0') == '0') c[0] = '\040'; //前面的0改成空格
}..........12345--------a
..........x1234--------b
--------------
..........49380
.......37035
....24690
..12345
--------------
..15233730
积的:
个位:b的个位×a的个位=4×5=20,个位0,进位2;
十位:后面进位+b的个位×a的十位+b的10位×a的个位=2+4×4+3×5=33,十位3,进位3
百位:后面进位+b的个位×a的百位+b的10位×a的十位+b的100位×a的个位=3+4×3+3×4+2×5=37,百位7,进位3
千位:后面进位+b的个位×a的千位+b的10位×a的百位+b的100位×a的10位+b的千位×a的个位=3+4×2+3×3+2×4+1×5=33,百位3,进位3
其余类推。
..........12345--------a
..........x1234--------b
--------------
..................20....4×5
................16....4×4
................15....3×5
-----------
................33
..............12....4×3
..............12....3×4
..............10....2×5
----------
..............37
..............8....4×2
..............9....3×3
..............8....2×4
..............5....1×5
---------
............33
............4....4×1
............6....3×2
............6....2×3
............4....1×4
--------
.........23
.........3....3×1
.........4....2×2
.........3....1×3
------
.......12
.......2....2×1
.......2....1×2
-----
.......5
.....1....1×1
--------------
....15233730
{
int i, j, m, n;
long sum, carry;
m = strlen(a) - 1;//第一个乘数的位数
n = strlen(b) - 1;//第二个成熟的位数
for (i = m; i >= 0; i--) a[i] -= '0'; //将数字字符转变成数
for (i = n; i >= 0; i--) b[i] -= '0'; //将数字字符转变成数
c[m + n + 2] = '\0'; //积的字符串末尾置0
carry = 0; //进位。下面是从个位起逐位计算每一位的数值,用的方法与人工列竖式计算完全一样
for (i = m + n; i >= 0; i--) //从积个位(最后面)到最高位(最前面)
{
sum = carry; //该位累加,先加上后面一位计算中的进位
if ((j = i - m) < 0) j = 0; //第i位的计算与第一个乘数中i位之前的各位没有关系
for ( ; j<=i && j<=n; j++) sum += a[i-j] * b[j]; //循环计算有关各位相乘的积并累加
c[i + 1] = sum % 10 + '0'; //计算累加结果的个位,就是当前位的值,+'0'转化成字符
carry = sum / 10; //计算结果除以10,是向前面一位的进位
}
if ((c[0] = carry+'0') == '0') c[0] = '\040'; //前面的0改成空格
}..........12345--------a
..........x1234--------b
--------------
..........49380
.......37035
....24690
..12345
--------------
..15233730
积的:
个位:b的个位×a的个位=4×5=20,个位0,进位2;
十位:后面进位+b的个位×a的十位+b的10位×a的个位=2+4×4+3×5=33,十位3,进位3
百位:后面进位+b的个位×a的百位+b的10位×a的十位+b的100位×a的个位=3+4×3+3×4+2×5=37,百位7,进位3
千位:后面进位+b的个位×a的千位+b的10位×a的百位+b的100位×a的10位+b的千位×a的个位=3+4×2+3×3+2×4+1×5=33,百位3,进位3
其余类推。
..........12345--------a
..........x1234--------b
--------------
..................20....4×5
................16....4×4
................15....3×5
-----------
................33
..............12....4×3
..............12....3×4
..............10....2×5
----------
..............37
..............8....4×2
..............9....3×3
..............8....2×4
..............5....1×5
---------
............33
............4....4×1
............6....3×2
............6....2×3
............4....1×4
--------
.........23
.........3....3×1
.........4....2×2
.........3....1×3
------
.......12
.......2....2×1
.......2....1×2
-----
.......5
.....1....1×1
--------------
....15233730
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯