注意数据格式,可以是整数,并且注意输出最简化浮点数。
1 #include <stdio.h>
2 #include <string.h>
3
4 #define MAXNUM 420
5
6 char a[MAXNUM], b[MAXNUM], c[MAXNUM], d[MAXNUM];
7 int lena, lenb;
8 int posa, posb;
9
10 int addf(int bega, int begb, int *carry);
11 int addi(int enda, int endb, int carry);
12 void add();
13 void output(int in, int fn);
14
15 int main() {
16
17 while (scanf("%s %s", a, b) != EOF) {
18 add();
19 memset(a, 0, sizeof(a));
20 memset(b, 0, sizeof(b));
21 memset(c, 0, sizeof(c));
22 memset(d, 0, sizeof(d));
23 }
24
25 return 0;
26 }
27
28 void add() {
29 int i, carry, in, fn;
30
31 posa = posb = -1;
32 for (i=0; i<MAXNUM; ++i) {
33 if (a[i] == ‘\0‘)
34 break;
35 else if (a[i] == ‘.‘)
36 posa = i;
37 else
38 a[i] -= ‘0‘;
39 }
40 lena = i;
41 if (posa == -1)
42 posa = lena;
43
44 for (i=0; i<MAXNUM; ++i) {
45 if (b[i] == ‘\0‘)
46 break;
47 else if (b[i] == ‘.‘)
48 posb = i;
49 else
50 b[i] -= ‘0‘;
51 }
52 lenb = i;
53 if (posb == -1)
54 posb = lenb;
55
56 fn = addf(posa+1, posb+1, &carry);
57 in = addi(posa, posb, carry);
58 output(in, fn);
59 }
60
61 void output(int in, int fn) {
62 int i;
63
64 // printf the integer part
65 while (in>=0 && c[in]==0)
66 --in;
67 if (in < 0)
68 printf("0");
69 else {
70 for (i=in; i>=0; --i)
71 printf("%d", c[i]);
72 }
73
74 fflush(stdout);
75 // printf the float part
76 while (fn>=0 && d[fn]==0)
77 --fn;
78 if (fn>=0) {
79 printf(".");
80 for (i=0; i<=fn; ++i)
81 printf("%d", d[i]);
82 }
83 printf("\n");
84 fflush(stdout);
85 }
86
87 int addi(int enda, int endb, int carry) {
88 int cn = 0;
89
90 while (enda || endb) {
91 c[cn] += carry;
92 if (enda) {
93 --enda;
94 c[cn] += a[enda];
95 }
96 if (endb) {
97 --endb;
98 c[cn] += b[endb];
99 }
100 carry = c[cn]/10;
101 c[cn] %= 10;
102 ++cn;
103 }
104 c[cn] += carry;
105
106 return cn;
107 }
108
109 int addf(int bega, int begb, int *carry) {
110 int i, len, ov = 0;
111 int flena = lena - bega;
112 int flenb = lenb - begb;
113
114 len = (flena>flenb) ? flena : flenb;
115
116 for (i=len-1; i>=0; --i) {
117 d[i] += ov;
118 if (bega+i < lena)
119 d[i] += a[bega+i];
120 if (begb+i < lenb)
121 d[i] += b[begb+i];
122 ov = d[i]/10;
123 d[i] %= 10;
124 }
125
126 *carry = ov;
127
128 return len;
129 }
【HDOJ】1753 大明A+B,布布扣,bubuko.com
时间: 2024-10-22 01:29:03