teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2021/05/30 13:55

投稿

otn
otn

スコア86349

answer CHANGED
@@ -1,2 +1,53 @@
1
1
  `1234567`と`789`を筆算で足すときに、どういうやり方をしているか思い出して、
2
- それと同じやり方をすればいいです。
2
+ それと同じやり方をすればいいです。
3
+ #追記
4
+ 筆算のやり方が分からないと言うことなので。
5
+ ```C
6
+ int add(char p, char q, int carry, char *r){
7
+ int ans;
8
+ ans = (p - '0') + (q - '0') + carry;
9
+ *r = ans % 10 + '0';
10
+ return ans/10;
11
+ }
12
+
13
+ void longint_add(struct longint *p, struct longint *q, struct longint *r){
14
+ char *p0, *p1, *q0, *q1;
15
+ int pe=0, qe=0; // 全部の桁が終わったかフラグ
16
+ char ans[MAX_INPUT+1], *ans1;
17
+ int carry=0; // 繰り上がり
18
+
19
+ ans[MAX_INPUT] = '\0';
20
+ ans1 = ans + MAX_INPUT - 1;
21
+ p0 = p->val;
22
+ for(p1=p0; *(p1+1)>='0'; p1++); // p1 を最下桁にセット
23
+ q0 = q->val;
24
+ for(q1=q0; *(q1+1)>='0'; q1++); // q1 を最下桁にセット
25
+ while(!pe && !qe){ // 両方とも全部の桁が終わるまでループ
26
+ carry = add( pe ? '0' : *p1, qe ? '0' : *q1, carry, ans1);
27
+ if(p0==p1) { // 全部の桁が終わったか?
28
+ pe = 1;
29
+ }else{
30
+ p1--;
31
+ }
32
+ if(q0==q1){ // 全部の桁が終わったか?
33
+ qe = 1;
34
+ }else{
35
+ q1--;
36
+ }
37
+ ans1--;
38
+ }
39
+ if(carry){
40
+ *ans1 = carry + '0';
41
+ }else{
42
+ ans1++;
43
+ }
44
+ strcpy(r->val, ans1);
45
+ }
46
+ ```
47
+ あと、呼び出し前に、
48
+ ```C
49
+ char answer[MAX_INPUT+1];
50
+ ~~
51
+ pAdd_Answer1 -> val = answer;
52
+ ```
53
+ のような、答えの格納エリアの用意が必要です。