回答編集履歴

1

追記

2021/05/30 13:55

投稿

otn
otn

スコア84667

test CHANGED
@@ -1,3 +1,105 @@
1
1
  `1234567`と`789`を筆算で足すときに、どういうやり方をしているか思い出して、
2
2
 
3
3
  それと同じやり方をすればいいです。
4
+
5
+ #追記
6
+
7
+ 筆算のやり方が分からないと言うことなので。
8
+
9
+ ```C
10
+
11
+ int add(char p, char q, int carry, char *r){
12
+
13
+ int ans;
14
+
15
+ ans = (p - '0') + (q - '0') + carry;
16
+
17
+ *r = ans % 10 + '0';
18
+
19
+ return ans/10;
20
+
21
+ }
22
+
23
+
24
+
25
+ void longint_add(struct longint *p, struct longint *q, struct longint *r){
26
+
27
+ char *p0, *p1, *q0, *q1;
28
+
29
+ int pe=0, qe=0; // 全部の桁が終わったかフラグ
30
+
31
+ char ans[MAX_INPUT+1], *ans1;
32
+
33
+ int carry=0; // 繰り上がり
34
+
35
+
36
+
37
+ ans[MAX_INPUT] = '\0';
38
+
39
+ ans1 = ans + MAX_INPUT - 1;
40
+
41
+ p0 = p->val;
42
+
43
+ for(p1=p0; *(p1+1)>='0'; p1++); // p1 を最下桁にセット
44
+
45
+ q0 = q->val;
46
+
47
+ for(q1=q0; *(q1+1)>='0'; q1++); // q1 を最下桁にセット
48
+
49
+ while(!pe && !qe){ // 両方とも全部の桁が終わるまでループ
50
+
51
+ carry = add( pe ? '0' : *p1, qe ? '0' : *q1, carry, ans1);
52
+
53
+ if(p0==p1) { // 全部の桁が終わったか?
54
+
55
+ pe = 1;
56
+
57
+ }else{
58
+
59
+ p1--;
60
+
61
+ }
62
+
63
+ if(q0==q1){ // 全部の桁が終わったか?
64
+
65
+ qe = 1;
66
+
67
+ }else{
68
+
69
+ q1--;
70
+
71
+ }
72
+
73
+ ans1--;
74
+
75
+ }
76
+
77
+ if(carry){
78
+
79
+ *ans1 = carry + '0';
80
+
81
+ }else{
82
+
83
+ ans1++;
84
+
85
+ }
86
+
87
+ strcpy(r->val, ans1);
88
+
89
+ }
90
+
91
+ ```
92
+
93
+ あと、呼び出し前に、
94
+
95
+ ```C
96
+
97
+ char answer[MAX_INPUT+1];
98
+
99
+ ~~
100
+
101
+ pAdd_Answer1 -> val = answer;
102
+
103
+ ```
104
+
105
+ のような、答えの格納エリアの用意が必要です。