【競プロ】整数の足し算と引き算

ここでは、整数同士の足し算や引き算について見ていきます。小学校や中学校で学ぶ内容がメインです。C++を前提として説明しています。 $3+(-5)=-2$, $7-(-4)=11$ などの計算に疑問がわかないなら、このページは飛ばしても構いません。競プロ 記事の一覧はこちら

【広告】

正の整数を足す

ある整数に対して、何回かインクリメントを行ってみます。

#include <iostream>
using namespace std;

int main() {
  int a = 3, b = 5;
  for (int i = 0; i < b; i++) a++;
  cout << a; // 8
  return 0;
}

$3$ に対して、5回インクリメントを行っています。このように、ある整数 $a$ に、 $b$ 回だけインクリメントを行う($b$ は正の整数)ことを、「 $a$ に $b$ を足す(加える)」「 $a$ と $b$ を足す」といいます。この計算を足し算(addition) といい、 $a+b$ という式で表します。コードでも、a + bで表します。そのため、上の計算は次のように書きます。

#include <iostream>
using namespace std;

int main() {
  int a = 3, b = 5;
  cout << a + b; // 8
  return 0;
}

足し算は、「 $a$ より $b$ だけ大きい数を返す」とか「りんご $a$ 個とりんご $b$ 個を合わせたときの、全体のりんごの数を表す」とか「数直線で、 $a$ から右へ $b$ だけ移動した点を表す」などと考えることもできます。

足し算は、加算加法ともいいます。足し算の答えのことを、(sum) といいます。先ほどの計算は、「 $3$ と $5$ の和は $8$ だ」ということができます。

ここでは説明のためにインクリメントを使いましたが、足し算をインクリメントで書くことはありません。 $N$ を足す場合、インクリメントを使うと計算回数が $N$ 回になってしまいますが、足し算を使えば1回の計算で済むからです。

なお、 $0$ を足しても値は変わりません。 $3+0=3$ です。

if文の使い方がわかっているなら、AtCoder ABC 091 A – Two Coinsができるでしょう。

正の整数を引く

ある整数に対して、何回かデクリメントを行ってみます。

#include <iostream>
using namespace std;

int main() {
  int a = 7, b = 4;
  for (int i = 0; i < b; i++) a--;
  cout << a; // 3
  return 0;
}

$7$ に対して、4回デクリメントしています。このように、ある整数 $a$ に、 $b$ 回だけデクリメントを行う($b$ は正の整数)ことを、「 $a$ から $b$ を引く」といいます。この計算を引き算(subtraction) といい、 $a-b$ という式で表します。コードでも、a - bで表します。そのため、上の計算は次のように書きます。

#include <iostream>
using namespace std;

int main() {
  int a = 7, b = 4;
  cout << a - b; // 3
  return 0;
}

引き算は、「 $a$ より $b$ だけ小さい数を返す」とか「りんご $a$ 個からりんご $b$ 個を取り除いたときの、残ったりんごの数を表す」とか「数直線で、 $a$ から左へ $b$ だけ移動した点を表す」などと考えることもできます。

引き算は、減算減法ともいいます。引き算の答えのことを、(difference) といいます。先ほどの計算は、「 $7$ と $4$ の差は $3$ だ」ということができます。

なお、 $0$ を引いても値は変わりません。 $7-0=7$ です。

足し算と引き算は、やっていることが反対なので、 $a+b=c$ と $c-b=a$ が同じ意味となります。

文字の扱いがわかっているなら、正の整数同士の足し算と引き算がわかれば、AtCoder ABC 050 A – Addition and Subtraction Easyができるでしょう。

【広告】
入門レベルの簡単な問題から、上級レベルの高度な問題まで、TopCoder攻略のノウハウを満載。
著者: 高橋 直大
出版社: SBクリエイティブ
発売日: 2012/09/27
436ページ

負の整数を足す

正の整数を足す計算では、 $a=3$, $b=5$ のときに $a+b$ を考えました。ここでは、 $a=3$, $b=-5$ のときに、 $a+b$ がどうなるかを考えてみます。

正の整数のときと同じように考えれば、-5回だけインクリメントすることになりますが、これはわかりづらいですね。

そこで、インクリメントする回数を減らしていくとどうなるかを考えてみます。インクリメントする回数を 5回、4回、3回と減らしていくと、和は、8、7、6 と、1ずつ減っていきます。増やすのをやめるのだから、結果は減っていくわけです。

-5 が 0 より 5 だけ小さいことを考えれば、「-5回インクリメントする」ことは、「5回デクリメントする」ことと同じになることがわかります。実際に、a + bの結果とデクリメントした結果とを比べてみましょう。

#include <iostream>
using namespace std;

int main() {
  int a = 3, b = -5;
  cout << a + b << "\n"; // -2
  for (int i = 0; i < abs(b); i++) a--;
  cout << a; // -2
  return 0;
}

同じ結果になっています。なお、 abs は、絶対値を表す関数です(参考:【競プロ】数の大小)。

整数 $a$ に負の整数 $b$ を足すことは、 $b$ の符号を変えて $a$ から引くことと同じです。また、数直線を使えば、正の整数を足すことが右への移動だったので、負の整数を足すことが逆向きの左への移動になる、と対応付けて考えることもできるでしょう。

負の整数を引く

正の整数を引く計算では、 $a=7$, $b=4$ のときに $a-b$ を考えました。では、 $a=7$, $b=-4$ なら、 $a-b$ はどうなるでしょうか。

今回も、-4回だけデクリメントするのは考えづらいので、デクリメントする回数を減らしていくとどうなるかを考えてみます。

デクリメントする回数を 4回、3回、2回と減らしていくと、差は、3、4、5 と、1ずつ増えていきます。減らすのをやめるのだから、結果は増えていきます。

-4 は 0 を 4 減らしたものなので、「-4回デクリメントする」ことは、「4回インクリメントする」ことと同じになります。実際に、a - bとインクリメントした結果とを比べてみましょう。

#include <iostream>
using namespace std;

int main() {
  int a = 7, b = -4;
  cout << a - b << "\n"; // 11
  for (int i = 0; i < abs(b); i++) a++;
  cout << a; // 11
  return 0;
}

同じ結果になっています。

ある整数 $a$ から負の整数 $b$ を引くことは、 $b$ の符号を変えて $a$ に足すことと同じです。また、数直線で考えるなら、正の整数を引くことが左への移動だったので、負の整数を引くことが逆向きの右への移動になる、と対応付けることもできるでしょう。

【広告】

なぜ負の数を引くとプラスになるか

ここまで見た4つの計算の中で、一番わかりにくいのは、負の数の引き算でしょう。どうして負の数を引くとプラスになるのでしょうか。これを考えるには、気温を使ってみるといいです。すでに日常でもこの計算を行っているはずだからです。

天気予報で気温の予報を見たとします。明日の最高気温が20度で、今日と比較して+5度だとすると、今日の最高気温は\[ 20-5=15 \]というように、引き算で求められます。

同様に考えれば、明日の最高気温の予想が20度で、今日と比較して-5度だったとすると、今日の最高気温は $20-(-5)$ と計算できるはずです。実際にこの計算をしなくても、「今日から5度下がって明日が20度ということは、今日は25度だな」と考えているはずです。経験的に、 $20-(-5)$ を $20+5$ と計算しています。

気温のことを考えれば、負の数を引くことは、正の数を足すことと同じになることが分かると思います。

おわりに

ここでは、整数の足し算・引き算について見てきました。負の引き算が、符号を変えて足す点以外は、難しいところは少ないと思います。競プロでは、これらの計算を手で行うことはないですが、基本的な計算なのでできておいたほうがいいでしょう。

数学の内容として学びたい場合は、【導入】気温と負の数の引き算のページと、このページの下にある関連ページを見てみましょう。