C++
 Computer >> コンピューター >  >> プログラミング >> C++

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²)となるため、問題数がそこまで大きくない場合に有効なアプローチです。

本チュートリアルについてご不明な点がありましたら、コメント欄でお気軽にお尋ねください。

  1. C++で8進数を10進数に変換するプログラムの書き方

    8進数が入力として与えられたとき、それを10進数に変換するのが本記事のテーマです。 コンピュータ上の10進数は基数10で表現されます。一方、8進数は基数8で表現され、使用できる数字は0〜7に限られます。これに対して10進数では、0〜9までの任意の数字を使用することができます。 8進数から10進数への変換手順 右から左へ向かって剰余演算により各桁を取り出し、0から始まるべき乗を掛けます。指数は「桁数 − 1」に達するまで1ずつ増加させます。 8進数を変換するため、べき乗の基数は8となります(8進数の基数が8であるため)。 入力された数値の各桁に基数とべき乗を掛け、その結果を記録します。 すべて

  2. C++で立方体の体積と表面積を求めるプログラム

    立方体とは? 立方体とは、正方形の面を6つ持つ三次元の立体図形です。すべての辺の長さが等しいという特徴があります。立方体は唯一の正六面体であり、以下のような性質を持ちます。 面の数:6つ 辺の数:12本 頂点の数:8つ 以下は立方体の図です。 問題の概要 立方体の一辺の長さが与えられたとき、その立方体の表面積と体積を求めることが課題です。ここで、表面積とは立方体の各面が占める面積の合計を指し、体積とはその図形が内包できる空間の大きさを指します。 立方体の表面積と体積を計算するには、次の公式を使用します。 表面積 = 6 × 辺 × 辺 体積 = 辺 × 辺 × 辺 入力例と出力例 入力