C#で余りを求める方法|%演算子の使い方・割り切れる判定・負の数の注意点
はじめに
C#で割り算の「余り」を求めたい場合は、%演算子を使います。
たとえば、10を3で割ると商は3、余りは1です。C#ではこの余りを次のように書いて求めます。
C#int result = 10 % 3;
Console.WriteLine(result);
実行結果は次のとおりです。
C#1
「C# 余り」と検索している方の多くは、割り切れるかどうかを判定したい、偶数・奇数を調べたい、一定回数ごとに処理を実行したい、といった目的があるはずです。
この記事では、C#で余りを求める基本から、%演算子の使い方、割り切れる判定、負の数を扱うときの注意点、Math.DivRemを使う方法まで、初心者にもわかりやすく解説します。
1. C#で余りを求めるには?結論は%演算子を使う
C#で余りを求めるには、%演算子を使います。
%は「剰余演算子」と呼ばれ、割り算をしたときに余った値を返します。
C#int remainder = 10 % 3;
Console.WriteLine(remainder);
実行結果は次のようになります。
C#1
10を3で割ると、3が3回入り、1が余ります。そのため、10 % 3の結果は1になります。
1-1. C#の「余り」とは割り算で割り切れずに残る値のこと
「余り」とは、割り算をしたときに割り切れずに残る値のことです。
たとえば、10個のリンゴを3人に同じ数ずつ配るとします。
1人に3個ずつ配ると、合計で9個配ることになります。手元には1個残ります。この残った1個が「余り」です。
計算式で表すと、次のようになります。
10 ÷ 3 = 3 余り 1
C#では、この「余り 1」の部分を%演算子で求めます。
C#10 % 3
結果は1です。
1-2. C#で余りを求める基本構文
C#で余りを求める基本構文は次のとおりです。
C#左の値 % 右の値
左の値を右の値で割ったときの余りが返されます。
C#int answer = 10 % 3;
この場合、10を3で割った余りをanswerに代入しています。
主な例を見てみましょう。
C#Console.WriteLine(10 % 3); // 1
Console.WriteLine(10 % 2); // 0
Console.WriteLine(7 % 4); // 3
Console.WriteLine(15 % 6); // 3
10 % 2の結果は0です。これは、10が2で割り切れるためです。
1-3. まず覚えるべき計算例:10 % 3 は 1
C#の余りを理解するうえで、まず覚えておきたいのが次の計算です。
C#10 % 3
結果は次のとおりです。
C#1
なぜなら、10を3で割ると次のようになるからです。
10 ÷ 3 = 3 余り 1
C#では、商の3ではなく、余りの1が返されます。
なお、商を求めたい場合は/演算子を使います。
C#Console.WriteLine(10 / 3); // 3
Console.WriteLine(10 % 3); // 1
/は割り算、%は余りを求める演算子です。
1-4. 「%」はパーセントではなく剰余演算子として使う
日常的には%を見ると「パーセント」を思い浮かべるかもしれません。
しかし、C#の計算式の中で使う%は、基本的にパーセントではなく剰余演算子です。
C#int result = 20 % 6;
Console.WriteLine(result);
実行結果は次のようになります。
C#2
20の6%を計算しているわけではありません。20を6で割ったときの余りを求めています。
20 ÷ 6 = 3 余り 2
そのため、結果は2です。
割合としてのパーセント計算をしたい場合は、次のように別の計算式を書く必要があります。
C#double price = 1000;
double taxRate = 0.10;
double tax = price * taxRate;
Console.WriteLine(tax);
%演算子は、C#では余りを求めるときに使うものだと覚えておきましょう。
2. C#の%演算子の基本的な使い方
ここからは、C#の%演算子の基本的な使い方をコードで確認していきます。
%演算子は、整数の計算でよく使われます。特にint型の値を使った余り計算は、初心者が最初に覚えるべき基本です。
2-1. int型で余りを求めるサンプルコード
次のコードは、int型の数値を使って余りを求める例です。
C#int result = 10 % 3;
Console.WriteLine(result);
実行結果は次のとおりです。
C#1
10 % 3は、10を3で割った余りを表します。
もう少し例を見てみましょう。
C#Console.WriteLine(8 % 3); // 2
Console.WriteLine(12 % 5); // 2
Console.WriteLine(20 % 4); // 0
Console.WriteLine(21 % 4); // 1
余りが0になる場合は、その数が割り切れていることを意味します。
C#Console.WriteLine(20 % 4); // 0
20は4で割り切れるため、余りは0です。
2-2. 変数を使って余りを計算する方法
実際のプログラムでは、直接数値を書くよりも、変数を使って余りを計算することが多いです。
C#int number = 17;
int divisor = 5;
int remainder = number % divisor;
Console.WriteLine(remainder);
実行結果は次のようになります。
C#2
17を5で割ると、3余り2です。そのため、remainderには2が入ります。
変数名をわかりやすくすると、コードの意味も読み取りやすくなります。
C#int totalCount = 23;
int groupSize = 4;
int remainingCount = totalCount % groupSize;
Console.WriteLine(remainingCount);
この例では、23個のデータを4個ずつのグループに分けたとき、余りがいくつになるかを求めています。
C#3
4個ずつのグループが5つでき、3個余るという意味です。
2-3. Console.WriteLineで余りを表示する例
C#で学習用のコードを書く場合、Console.WriteLineを使って計算結果を表示することが多いです。
C#int a = 10;
int b = 3;
Console.WriteLine(a % b);
実行結果は次のとおりです。
C#1
文字列と一緒に表示することもできます。
C#int a = 10;
int b = 3;
int remainder = a % b;
Console.WriteLine($"{a}を{b}で割った余りは{remainder}です。");
実行結果は次のようになります。
C#10を3で割った余りは1です。
このように、文字列補間を使うと、計算結果をわかりやすく表示できます。
複数の余り計算をまとめて表示することもできます。
C#Console.WriteLine($"10 % 3 = {10 % 3}");
Console.WriteLine($"10 % 2 = {10 % 2}");
Console.WriteLine($"15 % 4 = {15 % 4}");
実行結果は次のとおりです。
C#10 % 3 = 1
10 % 2 = 0
15 % 4 = 3
2-4. /演算子と%演算子の違い
C#では、/演算子と%演算子はどちらも割り算に関係しますが、返す値が違います。
/演算子は商を求めます。
C#int quotient = 10 / 3;
Console.WriteLine(quotient);
実行結果は次のとおりです。
C#3
一方、%演算子は余りを求めます。
C#int remainder = 10 % 3;
Console.WriteLine(remainder);
実行結果は次のとおりです。
C#1
つまり、次のように考えるとわかりやすいです。
10 ÷ 3 = 3 余り 1
C#では次のように対応します。
C#10 / 3 // 商の3
10 % 3 // 余りの1
/と%を組み合わせると、割り算の結果を商と余りに分けて扱えます。
C#int number = 10;
int divisor = 3;
int quotient = number / divisor;
int remainder = number % divisor;
Console.WriteLine($"商: {quotient}");
Console.WriteLine($"余り: {remainder}");
実行結果は次のとおりです。
C#商: 3
余り: 1
3. C#で割り切れるか判定する方法
C#の%演算子は、単に余りを求めるだけでなく、「割り切れるかどうか」を判定するときにもよく使います。
割り切れるかどうかを調べる基本は、余りが0かどうかです。
3-1. 余りが0なら割り切れる
ある数を別の数で割ったとき、余りが0なら割り切れます。
たとえば、10は2で割り切れます。
C#Console.WriteLine(10 % 2);
実行結果は次のとおりです。
C#0
一方、10は3では割り切れません。
C#Console.WriteLine(10 % 3);
実行結果は次のとおりです。
C#1
つまり、C#では次の条件式で割り切れるかどうかを判定できます。
C#number % divisor == 0
この式がtrueなら割り切れる、falseなら割り切れないという意味です。
3-2. if文で「割り切れる・割り切れない」を判定する
実際にif文を使って、割り切れるかどうかを判定してみましょう。
C#int number = 10;
int divisor = 2;
if (number % divisor == 0)
{
Console.WriteLine("割り切れます");
}
else
{
Console.WriteLine("割り切れません");
}
実行結果は次のとおりです。
C#割り切れます
10 % 2の結果が0なので、if文の条件がtrueになります。
次に、割り切れない例です。
C#int number = 10;
int divisor = 3;
if (number % divisor == 0)
{
Console.WriteLine("割り切れます");
}
else
{
Console.WriteLine("割り切れません");
}
実行結果は次のようになります。
C#割り切れません
10 % 3の結果は1なので、条件式number % divisor == 0はfalseになります。
3-3. 偶数・奇数を判定する方法
C#で偶数・奇数を判定するときも、%演算子を使います。
偶数とは、2で割り切れる数です。つまり、2で割った余りが0なら偶数です。
C#int number = 8;
if (number % 2 == 0)
{
Console.WriteLine("偶数です");
}
else
{
Console.WriteLine("奇数です");
}
実行結果は次のとおりです。
C#偶数です
奇数の場合は、2で割った余りが0ではありません。
C#int number = 7;
if (number % 2 == 0)
{
Console.WriteLine("偶数です");
}
else
{
Console.WriteLine("奇数です");
}
実行結果は次のようになります。
C#奇数です
奇数かどうかを明示的に判定したい場合は、次のようにも書けます。
C#if (number % 2 != 0)
{
Console.WriteLine("奇数です");
}
!=は「等しくない」という意味です。
3-4. 3の倍数・5の倍数を判定する方法
倍数の判定にも%演算子を使います。
3の倍数かどうかを判定するには、3で割った余りが0かどうかを調べます。
C#int number = 12;
if (number % 3 == 0)
{
Console.WriteLine("3の倍数です");
}
実行結果は次のとおりです。
C#3の倍数です
5の倍数を判定する場合は、5で割った余りを調べます。
C#int number = 20;
if (number % 5 == 0)
{
Console.WriteLine("5の倍数です");
}
実行結果は次のとおりです。
C#5の倍数です
3の倍数かつ5の倍数、つまり15の倍数を判定したい場合は、次のように書けます。
C#int number = 30;
if (number % 3 == 0 && number % 5 == 0)
{
Console.WriteLine("3の倍数かつ5の倍数です");
}
&&は「かつ」という意味です。
もちろん、15で割り切れるかどうかを直接判定しても構いません。
C#if (number % 15 == 0)
{
Console.WriteLine("15の倍数です");
}
3-5. FizzBuzzで%演算子を使う例
%演算子の代表的な練習問題に、FizzBuzzがあります。
FizzBuzzは、1から順番に数を表示し、次の条件で表示内容を変える問題です。
3の倍数ならFizz
5の倍数ならBuzz
3と5の両方の倍数ならFizzBuzz
それ以外は数字を表示
C#では次のように書けます。
C#for (int i = 1; i <= 30; i++)
{
if (i % 3 == 0 && i % 5 == 0)
{
Console.WriteLine("FizzBuzz");
}
else if (i % 3 == 0)
{
Console.WriteLine("Fizz");
}
else if (i % 5 == 0)
{
Console.WriteLine("Buzz");
}
else
{
Console.WriteLine(i);
}
}
ここで重要なのは、最初にi % 3 == 0 && i % 5 == 0を判定している点です。
もし先に3の倍数だけを判定してしまうと、15や30のような数もFizzとして処理されてしまいます。
C#// よくない例
if (i % 3 == 0)
{
Console.WriteLine("Fizz");
}
else if (i % 5 == 0)
{
Console.WriteLine("Buzz");
}
else if (i % 3 == 0 && i % 5 == 0)
{
Console.WriteLine("FizzBuzz");
}
この書き方では、15は最初のi % 3 == 0に当てはまるため、FizzBuzzまで到達しません。
FizzBuzzでは、条件の順番にも注意しましょう。
4. C#の余り計算でよく使う実用例
C#の余り計算は、実務でもよく使われます。
特に、繰り返し処理、配列の添字、時間変換、ページング、ゲーム開発などで活躍します。
4-1. 一定回数ごとに処理を実行する
%演算子は、一定回数ごとに処理を実行したいときに便利です。
たとえば、ループの中で5回ごとにメッセージを表示したい場合は、次のように書けます。
C#for (int i = 1; i <= 20; i++)
{
Console.WriteLine(i);
if (i % 5 == 0)
{
Console.WriteLine("5回ごとの処理です");
}
}
このコードでは、iが5、10、15、20のときに特別な処理が実行されます。
i % 5 == 0
という条件は、「iが5で割り切れる」という意味です。
ログ出力、進捗表示、定期的な保存処理などに使えます。
C#for (int count = 1; count <= 100; count++)
{
// 通常処理
if (count % 10 == 0)
{
Console.WriteLine($"{count}件処理しました");
}
}
このように書くと、10件ごとに進捗を表示できます。
4-2. 配列やリストの添字を循環させる
%演算子は、配列やリストの添字を循環させるときにも使えます。
たとえば、3つの色を順番に繰り返し使いたい場合を考えます。
C#string[] colors = { "Red", "Green", "Blue" };
for (int i = 0; i < 10; i++)
{
string color = colors[i % colors.Length];
Console.WriteLine(color);
}
実行結果は次のようになります。
Red
Green
Blue
Red
Green
Blue
Red
Green
Blue
Red
colors.Lengthは配列の要素数です。この例では3です。
i % colors.Lengthによって、添字は次のように変化します。
0 % 3 = 0
1 % 3 = 1
2 % 3 = 2
3 % 3 = 0
4 % 3 = 1
5 % 3 = 2
そのため、配列の範囲を超えずに、0、1、2を繰り返すことができます。
スライドショー、順番に色を変える処理、ローテーション処理などでよく使われます。
4-3. 秒数を分と秒に変換する
秒数を「分」と「秒」に変換するときにも、/演算子と%演算子を組み合わせます。
たとえば、125秒を分と秒に変換してみましょう。
C#int totalSeconds = 125;
int minutes = totalSeconds / 60;
int seconds = totalSeconds % 60;
Console.WriteLine($"{minutes}分{seconds}秒");
実行結果は次のとおりです。
2分5秒
125秒は、60秒が2つ分で120秒、残りが5秒です。
C#125 / 60 // 2
125 % 60 // 5
/で分を求め、%で余った秒数を求めています。
時間、タイマー、動画の再生時間、ゲーム内のカウントダウンなどでよく使う考え方です。
4-4. ページングやグループ分けに使う
余り計算は、ページングやグループ分けでも役立ちます。
たとえば、データ件数が23件あり、1ページに5件ずつ表示する場合を考えます。
C#int totalItems = 23;
int pageSize = 5;
int fullPages = totalItems / pageSize;
int remainder = totalItems % pageSize;
Console.WriteLine($"完全なページ数: {fullPages}");
Console.WriteLine($"余りの件数: {remainder}");
実行結果は次のとおりです。
完全なページ数: 4
余りの件数: 3
5件ずつのページが4ページでき、3件が余ります。
実際に必要なページ数を求める場合は、余りがあるかどうかで1ページ追加します。
C#int totalItems = 23;
int pageSize = 5;
int pageCount = totalItems / pageSize;
if (totalItems % pageSize != 0)
{
pageCount++;
}
Console.WriteLine($"必要なページ数: {pageCount}");
実行結果は次のとおりです。
必要なページ数: 5
23件を5件ずつ表示するには、5ページ必要です。
このように、%演算子を使うと「余りがあるなら追加で処理する」という判定が簡単に書けます。
4-5. Unityで一定間隔の処理やループに使う
C#はUnityでも使われます。Unityのスクリプトでも、余り計算はよく登場します。
たとえば、配列に入れた敵の種類を順番に繰り返し選びたい場合は、次のように書けます。
C#string[] enemies = { "Slime", "Bat", "Goblin" };
for (int i = 0; i < 10; i++)
{
string enemy = enemies[i % enemies.Length];
Debug.Log(enemy);
}
i % enemies.Lengthを使うことで、配列の添字が0、1、2、0、1、2のように循環します。
また、フレーム数やカウントを使って、一定間隔ごとに処理することもあります。
C#int count = 0;
void Update()
{
count++;
if (count % 60 == 0)
{
Debug.Log("60回ごとの処理");
}
}
ただし、Unityで時間間隔を扱う場合は、フレーム数ではなくTime.deltaTimeを使ったほうが適切なケースもあります。
%演算子は、回数や番号をもとにした周期処理に向いています。
5. C#で負の数の余りを求めるときの注意点
C#で余りを扱うとき、特に注意したいのが負の数です。
正の数だけを扱う場合は直感的に理解しやすいですが、負の数が入ると結果が想像と違うことがあります。
5-1. C#では余りの符号は左側の値に合わせる
C#の%演算子では、余りの符号は左側の値、つまり割られる数に合わせます。
C#Console.WriteLine(5 % 3);
Console.WriteLine(-5 % 3);
Console.WriteLine(5 % -3);
Console.WriteLine(-5 % -3);
実行結果は次のようになります。
C#2
-2
2
-2
注目すべき点は、-5 % 3の結果が-2になることです。
右側の値が正でも、左側の値が負なら、余りも負になります。
5-2. -5 % 3 の結果は -2 になる
C#で次のコードを実行すると、結果は-2になります。
C#Console.WriteLine(-5 % 3);
実行結果は次のとおりです。
C#-2
これは、C#の整数除算が0に近づく方向に商を求めるためです。
-5 / 3 = -1
そして、次の関係が成り立ちます。
割られる数 = 割る数 × 商 + 余り
つまり、次のようになります。
-5 = 3 × (-1) + (-2)
そのため、-5 % 3の余りは-2になります。
5-3. 数学の剰余とC#の%演算子は結果が違う場合がある
数学で「mod」と考える場合、負の数に対して常に正の余りを期待することがあります。
たとえば、数学的には-5 mod 3を1として扱う場面があります。
しかし、C#の%演算子では次の結果になります。
C#Console.WriteLine(-5 % 3);
C#-2
つまり、数学で期待する剰余と、C#の%演算子の結果は、負の数を扱うときに一致しない場合があります。
これは、配列の添字を循環させる処理などでバグの原因になることがあります。
たとえば、次のようなコードは注意が必要です。
C#int index = -1;
int length = 5;
Console.WriteLine(index % length);
実行結果は次のとおりです。
C#-1
配列の添字として-1は使えないため、このまま使うとエラーになります。
5-4. 常に正の余りを得たい場合の書き方
負の数を含む計算で、常に0以上の余りを得たい場合は、次のように書くことがあります。
C#int mod = ((number % divisor) + divisor) % divisor;
たとえば、-5を3で割ったときに、正の余りを得たい場合は次のように書きます。
C#int number = -5;
int divisor = 3;
int mod = ((number % divisor) + divisor) % divisor;
Console.WriteLine(mod);
実行結果は次のとおりです。
C#1
計算の流れは次のようになります。
-5 % 3 = -2
-2 + 3 = 1
1 % 3 = 1
この書き方を使うと、負の数が入っても0以上の範囲に収めることができます。
配列の添字を循環させたい場合にも便利です。
C#string[] items = { "A", "B", "C" };
int index = -1;
int length = items.Length;
int safeIndex = ((index % length) + length) % length;
Console.WriteLine(items[safeIndex]);
実行結果は次のとおりです。
C
-1を配列の最後の要素として扱いたい場合、このような正の余りへの変換が役立ちます。
5-5. 負の数を扱うときにバグを防ぐ考え方
C#で負の数の余りを扱うときは、次の点を意識しましょう。
まず、%演算子の結果が必ず正になるとは考えないことが大切です。
C#-5 % 3 // -2
次に、配列やリストの添字に使う場合は、負の値にならないように調整しましょう。
C#int safeIndex = ((index % length) + length) % length;
また、そもそも負の値が入る可能性があるのかを確認することも重要です。
カウント、ページ番号、添字、IDなど、本来は負になってほしくない値であれば、入力チェックを入れるほうが安全です。
C#if (index < 0)
{
Console.WriteLine("indexは0以上である必要があります");
}
負の数を扱う必要がある場合は、C#の%演算子の仕様を理解したうえで、必要に応じて正の余りに変換しましょう。
6. C#の%演算子で起きやすいエラーと注意点
C#の%演算子は便利ですが、使い方を間違えるとエラーやバグの原因になります。
特に、0で割るケース、整数同士の割り算、小数の扱い、条件式の書き間違いには注意が必要です。
6-1. 0で割ると例外が発生する
C#では、0で割ろうとすると例外が発生します。
これは/演算子だけでなく、%演算子でも同じです。
C#int number = 10;
int divisor = 0;
int result = number % divisor;
このコードを実行すると、エラーになります。
整数の場合、0で割るとDivideByZeroExceptionが発生します。
そのため、割る数が変数の場合は、0でないことを確認してから計算するのが安全です。
C#int number = 10;
int divisor = 0;
if (divisor != 0)
{
int result = number % divisor;
Console.WriteLine(result);
}
else
{
Console.WriteLine("0では割れません");
}
ユーザー入力や外部データを使う場合は、割る数が0になる可能性を必ず考慮しましょう。
6-2. int同士の割り算は小数にならない
C#では、int同士を/で割ると、結果も整数になります。
C#int result = 10 / 3;
Console.WriteLine(result);
実行結果は次のとおりです。
C#3
3.333...にはなりません。小数部分は切り捨てられます。
一方、%演算子を使うと余りが求められます。
C#int quotient = 10 / 3;
int remainder = 10 % 3;
Console.WriteLine($"商: {quotient}");
Console.WriteLine($"余り: {remainder}");
実行結果は次のとおりです。
C#商: 3
余り: 1
小数の結果が必要な場合は、doubleなどを使います。
C#double result = 10.0 / 3.0;
Console.WriteLine(result);
この場合は、小数を含む結果になります。
整数の割り算と余りの計算は、目的に応じて使い分けましょう。
6-3. doubleやdecimalでも%は使えるが誤差に注意する
C#の%演算子は、intだけでなく、doubleやdecimalでも使えます。
C#double result = 10.5 % 3.0;
Console.WriteLine(result);
結果は次のようになります。
C#1.5
10.5を3.0で割ると、3.0が3回入り、1.5が余るという考え方です。
ただし、doubleは小数を2進数で扱うため、計算結果に誤差が出ることがあります。
C#double result = 0.3 % 0.1;
Console.WriteLine(result);
このような小数計算では、期待どおりにぴったり0にならない場合があります。
金額など、正確な小数計算が必要な場合は、decimalを使うことを検討しましょう。
C#decimal result = 10.5m % 3.0m;
Console.WriteLine(result);
decimalのリテラルにはmを付けます。
C#10.5m
小数の余り計算では、型による違いと誤差に注意しましょう。
6-4. if文の条件式で書き間違えやすい例
%演算子はif文でよく使いますが、条件式の書き間違いに注意が必要です。
たとえば、偶数判定をしたい場合、正しい書き方は次のとおりです。
C#if (number % 2 == 0)
{
Console.WriteLine("偶数です");
}
次のような書き方は間違いです。
C#if (number % 2)
{
Console.WriteLine("偶数です");
}
C#では、if文の条件式にはbool型、つまりtrueかfalseになる式が必要です。
number % 2の結果は整数なので、そのままif文の条件にはできません。
必ず次のように比較を書きます。
C#number % 2 == 0
また、=と==の違いにも注意しましょう。
C#if (number % 2 = 0)
{
}
このような書き方はできません。
比較には==を使います。
C#if (number % 2 == 0)
{
}
6-5. == 0 と != 0 の使い分け
余り計算では、== 0と!= 0をよく使います。
== 0は「余りが0」、つまり割り切れることを意味します。
C#if (number % 3 == 0)
{
Console.WriteLine("3で割り切れます");
}
一方、!= 0は「余りが0ではない」、つまり割り切れないことを意味します。
C#if (number % 3 != 0)
{
Console.WriteLine("3で割り切れません");
}
偶数・奇数の判定でも同じです。
C#if (number % 2 == 0)
{
Console.WriteLine("偶数です");
}
C#if (number % 2 != 0)
{
Console.WriteLine("奇数です");
}
どちらを使うべきかは、判定したい内容によって決まります。
割り切れることを調べたいなら== 0、割り切れないことを調べたいなら!= 0を使いましょう。
7. Math.DivRemで商と余りを同時に求める方法
C#では、/演算子と%演算子を使えば、商と余りをそれぞれ求められます。
ただし、商と余りを同時に取得したい場合は、Math.DivRemを使う方法もあります。
7-1. Math.DivRemとは
Math.DivRemは、割り算の商と余りを同時に求めるためのメソッドです。
通常、商と余りを求める場合は次のように書きます。
C#int number = 10;
int divisor = 3;
int quotient = number / divisor;
int remainder = number % divisor;
一方、Math.DivRemを使うと、次のように書けます。
C#int quotient = Math.DivRem(number, divisor, out int remainder);
Math.DivRemは商を戻り値として返し、余りをout引数で返します。
7-2. 商と余りを同時に取得するサンプルコード
実際にMath.DivRemを使って、商と余りを同時に取得してみましょう。
C#int number = 10;
int divisor = 3;
int quotient = Math.DivRem(number, divisor, out int remainder);
Console.WriteLine($"商: {quotient}");
Console.WriteLine($"余り: {remainder}");
実行結果は次のとおりです。
C#商: 3
余り: 1
10 ÷ 3は、商が3、余りが1です。
Math.DivRemを使うことで、商と余りを1つの処理で取得できます。
long型でも同じように使えます。
C#long number = 100L;
long divisor = 7L;
long quotient = Math.DivRem(number, divisor, out long remainder);
Console.WriteLine($"商: {quotient}");
Console.WriteLine($"余り: {remainder}");
7-3. %演算子とMath.DivRemの使い分け
余りだけが必要な場合は、%演算子を使うのがシンプルです。
C#int remainder = 10 % 3;
商だけが必要な場合は、/演算子を使います。
C#int quotient = 10 / 3;
商と余りの両方が必要な場合は、次のように/と%を組み合わせても問題ありません。
C#int quotient = 10 / 3;
int remainder = 10 % 3;
一方、商と余りをセットで取得したいことを明確に表したい場合は、Math.DivRemが便利です。
C#int quotient = Math.DivRem(10, 3, out int remainder);
初心者のうちは、まず/と%を覚えるのがおすすめです。そのうえで、商と余りを同時に扱う処理ではMath.DivRemも選択肢に入れるとよいでしょう。
7-4. 時間変換や割り算結果を両方使う場面で便利
Math.DivRemは、時間変換のように商と余りを両方使う場面で便利です。
たとえば、125秒を分と秒に変換する場合は次のように書けます。
C#int totalSeconds = 125;
int minutes = Math.DivRem(totalSeconds, 60, out int seconds);
Console.WriteLine($"{minutes}分{seconds}秒");
実行結果は次のとおりです。
2分5秒
この例では、Math.DivRemの戻り値が分、out引数が秒になります。
次のようなページング計算にも使えます。
C#int totalItems = 23;
int pageSize = 5;
int fullPages = Math.DivRem(totalItems, pageSize, out int remainingItems);
Console.WriteLine($"完全なページ数: {fullPages}");
Console.WriteLine($"余りの件数: {remainingItems}");
実行結果は次のとおりです。
完全なページ数: 4
余りの件数: 3
商と余りを同時に使う処理では、Math.DivRemを使うと意図が伝わりやすくなります。
8. C#の余りに関するよくある質問
最後に、C#の余りに関するよくある質問をまとめます。
8-1. C#で余りを求める演算子は何ですか?
C#で余りを求める演算子は%です。
C#int result = 10 % 3;
Console.WriteLine(result);
実行結果は次のとおりです。
C#1
%は剰余演算子と呼ばれ、左の値を右の値で割ったときの余りを返します。
8-2. C#で割り切れるか判定するには?
C#で割り切れるか判定するには、余りが0かどうかを調べます。
C#int number = 10;
int divisor = 2;
if (number % divisor == 0)
{
Console.WriteLine("割り切れます");
}
else
{
Console.WriteLine("割り切れません");
}
number % divisor == 0であれば、割り切れるという意味です。
8-3. C#で偶数・奇数を判定するには?
偶数かどうかは、2で割った余りが0かどうかで判定します。
C#if (number % 2 == 0)
{
Console.WriteLine("偶数です");
}
else
{
Console.WriteLine("奇数です");
}
奇数かどうかを直接判定したい場合は、次のように書けます。
C#if (number % 2 != 0)
{
Console.WriteLine("奇数です");
}
8-4. C#で負の数の余りがマイナスになるのはなぜ?
C#では、%演算子の結果の符号は左側の値に合わせます。
C#Console.WriteLine(-5 % 3);
実行結果は次のとおりです。
C#-2
左側の値である-5が負の数なので、余りも負になります。
常に正の余りを得たい場合は、次のように書きます。
C#int mod = ((number % divisor) + divisor) % divisor;
8-5. C#の%と数学のmodは同じですか?
C#の%演算子と数学のmodは、正の数だけを扱う場合は同じように見えることが多いです。
C#5 % 3 // 2
しかし、負の数を扱う場合は結果が異なることがあります。
C#-5 % 3 // -2
数学的な剰余としては1を期待する場面がありますが、C#の%演算子では-2になります。
そのため、負の数を扱う場合は、C#の%演算子の仕様を理解して使う必要があります。
まとめ
C#で余りを求めるには、%演算子を使います。
C#int remainder = 10 % 3;
10 % 3の結果は1です。これは、10を3で割ると1余るためです。
割り切れるかどうかを判定したい場合は、余りが0かどうかを調べます。
C#if (number % divisor == 0)
{
Console.WriteLine("割り切れます");
}
偶数・奇数の判定にも%演算子が使えます。
C#if (number % 2 == 0)
{
Console.WriteLine("偶数です");
}
else
{
Console.WriteLine("奇数です");
}
また、%演算子は、一定回数ごとの処理、配列の添字の循環、秒数の変換、ページング、FizzBuzzなど、さまざまな場面で使われます。
ただし、負の数を扱う場合は注意が必要です。
C#-5 % 3 // -2
C#では余りの符号が左側の値に合わせられるため、数学的なmodと異なる結果になることがあります。
常に正の余りを得たい場合は、次のように書きます。
C#int mod = ((number % divisor) + divisor) % divisor;
商と余りを同時に求めたい場合は、Math.DivRemも利用できます。
C#int quotient = Math.DivRem(10, 3, out int remainder);
C#の余り計算は、基本的な演算でありながら、実用的な場面で頻繁に使われます。まずは%演算子の基本を理解し、割り切れる判定や繰り返し処理で使えるようにしておきましょう。

