Posted in C/C++ 6 条留言

在CSDN上看到的题,说是华为的上机题。第一次写的时候忘了最高位的进位。被一哥们指出。然后又加了两行。大整数加法应该是大数运算里最简单的,减法稍难,乘法还要难一些,除法最难。学计算机组成原理的时候,除法也是最烦的,运行速度最慢的。

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
//按小学学的方法做。
void add_big(const char *num1, const char * num2, char *result, int len)
{
    char *p1 = num1 + strlen(num1) - 1;
    char *p2 = num2 + strlen(num2) - 1;
    char *r = result + len;
    int carry = 0;
    result[len+1] = '\0';
    while (p1>=num1 && p2>=num2)
    {
        int tmp = (*p1-'0')+(*p2-'0')+carry;
        if (tmp>=10)
        {
            carry = 1;
            tmp = tmp - 10;
            *r = tmp + '0';
        }
        else
        {
            carry = 0;
            *r = tmp + '0';
        }
        r--;
        p1--;
        p2--;
    }
    while (p1>=num1)
    {
        int tmp = *p1-'0'+carry;
        if (tmp>=10)
        {
            carry = 1;
            tmp = tmp - 10;
            *r = tmp + '0';
        }
        else
        {
            carry = 0;
            *r = tmp + '0';
        }
        r--;
        p1--;
 
    }
 
    while (p2>=num2)
    {
        int tmp = *p2-'0'+carry;
        if (tmp>=10)
        {
            carry = 1;
            tmp = tmp - 10;
            *r = tmp + '0';
        }
        else
        {
            carry = 0;
            *r = tmp + '0';
        }
        r--;
        p2--;
    }
 
    if(carry==1) *r = '1'; //这儿是新加的。
    else *r = '0';
}
 
 
int main()
{
    char *result;
    char *num1 = "99999999999999";
    char *num2 = "99999999999999";
    int len = 0;
    int num1_len = strlen(num1);
    int num2_len = strlen(num2);
 
    if (num1_len > num2_len)
        len = num1_len;
    else
        len = num2_len;
 
    result = (char *)malloc(len+2);
    memset(result, '0', len+2);
    if (result!=NULL)
    {
        char *p = result-1;
        add_big( num1, num2, result, len);
        while (*(++p)=='0');
        printf("%s\n", p);
 
    }
    return 0;
}
August 24, 2010