C++でn問の試験における加点・減点方式の全得点パターンを求める方法
本記事では、n問の試験において「正解で加点、不正解で減点」という採点ルールが適用される場合に、学生が取り得るすべての得点パターンを求めるC++プログラムを紹介します。
問題の概要
例として、全10問の試験を考えてみましょう。各問題は正解で2点、不正解で-1点となります。このとき、学生が試験で取り得る得点は何通りあるのでしょうか。この記事では、その総数を効率的に計算する方法を解説します。
解決の手順
以下のステップで問題を解いていきます。
問題数n、正解時の加点x、不正解時の減点yを初期化します。
可能な得点を格納するためのset(集合)を用意します。
0から問題数までの範囲で二重ループを実行し、すべての解答パターンを網羅します。
外側のループ変数iを「正解した問題数」、内側のループ変数jを「未回答の問題数」とし、残りの問題(n - i - j問)はすべて不正解とみなします。
計算した得点をsetに追加します。setは重複を自動的に排除するため、ユニークな得点のみが保持されます。
最後にsetのサイズ(要素数)を出力すれば、それが可能な得点パターンの総数になります。
実装コード
実際のコードを見てみましょう。
#include<bits/stdc++.h>
using namespace std;
int findPossibleMarksCount(int n, int x, int y) {
set<int> marks;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= n; j++) {
// i = 正解した問題数
// j = 未回答の問題数
marks.insert((x * i) - ((n - i - j) * y));
}
}
return marks.size();
}
int main() {
int n = 20, x = 2, y = -1;
cout << findPossibleMarksCount(n, x, y) << endl;
}実行結果
上記のコードを実行すると、次のような結果が出力されます。
41
この例では、20問・正解2点・不正解-1点という条件のもとで、学生が取り得る得点は41通りあることがわかります。
まとめ
setを活用することで、重複する得点を自動的に除外しながら、すべての解答パターンから生じるユニークな得点の数を簡単に求められます。時間計算量はO(n²)となるため、問題数がそこまで大きくない場合に有効なアプローチです。
本チュートリアルについてご不明な点がありましたら、コメント欄でお気軽にお尋ねください。
-
C++で8進数を10進数に変換するプログラムの書き方
8進数が入力として与えられたとき、それを10進数に変換するのが本記事のテーマです。 コンピュータ上の10進数は基数10で表現されます。一方、8進数は基数8で表現され、使用できる数字は0〜7に限られます。これに対して10進数では、0〜9までの任意の数字を使用することができます。 8進数から10進数への変換手順 右から左へ向かって剰余演算により各桁を取り出し、0から始まるべき乗を掛けます。指数は「桁数 − 1」に達するまで1ずつ増加させます。 8進数を変換するため、べき乗の基数は8となります(8進数の基数が8であるため)。 入力された数値の各桁に基数とべき乗を掛け、その結果を記録します。 すべて
-
C++で立方体の体積と表面積を求めるプログラム
立方体とは? 立方体とは、正方形の面を6つ持つ三次元の立体図形です。すべての辺の長さが等しいという特徴があります。立方体は唯一の正六面体であり、以下のような性質を持ちます。 面の数:6つ 辺の数:12本 頂点の数:8つ 以下は立方体の図です。 問題の概要 立方体の一辺の長さが与えられたとき、その立方体の表面積と体積を求めることが課題です。ここで、表面積とは立方体の各面が占める面積の合計を指し、体積とはその図形が内包できる空間の大きさを指します。 立方体の表面積と体積を計算するには、次の公式を使用します。 表面積 = 6 × 辺 × 辺 体積 = 辺 × 辺 × 辺 入力例と出力例 入力