首页 > 其他 > 详细

大数问题:用字符串解决大数相加和相乘

时间:2014-03-10 01:58:05      阅读:543      评论:0      收藏:0      [点我收藏+]

1、加法:

bubuko.com,布布扣
// assume m is bigger than n.
char* add(char *a, char *b, int m, int n)
{
    // 为结果分配内存空间。
    char *c = (char*)malloc((m + 2)* sizeof(char));
    memset(c, 0, (m + 2) * sizeof(char));
    // 将字符(0 + 0x30 到 9 + 0x30)转换为数字(0到9)进行计算。
    for (int i = m, j = n - 1; j >= 0; --i, --j)
        c[i] += (b[j] - 0x30);
    for (int i = m, j = m - 1; j >= 0; --i, --j)
    {
        c[i] += (a[j] - 0x30);
        if (c[i] > 9)
        {
            c[i - 1] += 1;
            c[i] -= 10;
        }
    }
    // 将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。
   c[m + 1] = /0;
    for (int i = 0; i != m + 1; ++i)
        c[i] += 0x30;
    if (c[0] == 0x30)
        for (int i = 0; c[i] != /0; ++i)
            c[i] = c[i + 1];
    // 返回结果所在内存单元的首地址。
    return c;
}
bubuko.com,布布扣

2、乘法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// assume m is bigger than n.
char* mult(char *a, char *b, int m, int n)
{
    // 为结果分配内存空间。
    char *c = (char*)malloc((m + n + 1) * sizeof(char));
    memset(c, 0, (m + n + 1) * sizeof(char));
 
    // 将字符(0 + 0x30 到 9 + 0x30)转换为数字(0到9)进行计算。
    for (int i = m - 1, r = m + n - 1; i >= 0; --i, --r)
    {
        for (int j = n - 1, k = r; j >= 0; --j, --k)
        {
            c[k] += (a[i] - 0x30) * (b[j] - 0x30);
            int tmp = c[k] / 10;
            if (tmp > 1)
            {
                c[k - 1] += tmp;
                c[k] -= tmp * 10;
            }
        }
    }
 
    // 将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。
    c[m + n] = ‘/0‘;
    for (int i = 0; i != m + n; ++i)
        c[i] += 0x30;
    if (c[0] == 0x30)
        for (int i = 0;  c[i] != ‘/0‘; ++i)
            c[i] = c[i + 1];
 
    // 返回结果所在内存单元的首地址。
    return c;
}

  

大数问题:用字符串解决大数相加和相乘,布布扣,bubuko.com

大数问题:用字符串解决大数相加和相乘

原文:http://www.cnblogs.com/renyuan/p/3590669.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!