中易网

C语言编程求两个大数的乘积,帮忙看一个程序分析一下

答案:1  悬赏:40  
解决时间 2021-03-22 12:19
#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';
}
最佳答案
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
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
木地板噪音的问题
手机qq不想看见好友qq签名怎么设置
坐月子到底是30天还是42天?什么时候可以碰凉
任仲传强力透骨膜管用吗?有副作用吗?
求北方的臭菜做法,不是羽叶金合欢。如图所示
不久之前如何译成英文?
路漫漫其修远兮,吾将上下而求索。 文言文翻
auto cad怎么设计箭头(交通设计的)
楼盘没有预售许可证的情况下,买了房子房产证
河南省南阳市邓州市邓襄路邮编是什么?
请问从深圳桃源村开车去深圳图书馆路线?
男朋友对我很认真 但我就是玩玩的心理 根本不
关于俚语graveyard shift的由来以及在日常生
新面试的单位,在新单位的主任跟我谈话面试时
设置您的数据库,及初始管理帐号
推荐资讯
贷款66万,30年,每月还多少钱
10086dkc.c n 这是中国移动公司的网站吗
繁峙县到宁波市有多远
春融西路(昆明医科大学西苑北门)自行车租赁点
一号店app怎么取消处理中的订单查询
想买5到8万的面包车或MPV,平时拉点小货,目
美团提现1500要审核多久
被辆破车碰了一下,小刮擦,但那碰我的车跑了
歌词中到底爱是什么是什么是什么歌曲
我最近在求一位领导帮忙我调动工作,他也答应
美国网件jndr3000接网线指示灯为橙色
好的考研论坛有哪些
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?