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

C++で文字列内の文字のアルファベット値の合計からスコアを計算する方法

問題概要

この問題では、文字列の配列 str[] が与えられ、配列内のすべての文字列の「スコア」を求めます。スコアは、文字列の位置(何番目にあるか)と、その文字列を構成する各文字のアルファベット値の合計との積として定義されます。

ここでいうアルファベット値とは、「a=1、b=2、c=3 … z=26」というように、各英小文字に対応する番号のことです。

入力例

str[] = {"learn", "programming", "tutorials", "point"}

計算例

「learn」は1番目 →

sum = 12 + 5 + 1 + 18 + 14 = 50
スコア = 50 × 1 = 50

「programming」は2番目 →

sum = 16 + 18 + 15 + 7 + 18 + 1 + 13 + 13 + 9 + 14 + 7 = 131
スコア = 131 × 2 = 262

「tutorials」は3番目 →

sum = 20 + 21 + 20 + 15 + 18 + 9 + 1 + 12 + 19 = 135
スコア = 135 × 3 = 405

「point」は4番目 →

sum = 16 + 15 + 9 + 14 + 20 = 74
スコア = 74 × 4 = 296

解決のためのアプローチ

この問題を解く最もシンプルな方法は、配列内のすべての文字列を順番に走査することです。各文字列について、その位置を記録しながらアルファベット値の合計を計算し、最後に位置と合計の積を求めて結果とします。

アルゴリズム

ステップ1: 文字列配列を先頭から走査し、各文字列の位置を保持します。各文字列に対してステップ2とステップ3を実行します。

ステップ2: 対象の文字列に含まれる文字のアルファベット値の合計を計算します。

ステップ3: 位置と合計値の積を求めて出力します。

C++による実装例

上記の解法の動作を示すプログラムは以下の通りです。

#include <iostream>
using namespace std;
int strScore(string str[], string s, int n, int index){
   int score = 0;
   for (int j = 0; j < s.length(); j++)
      score += s[j] - 'a' + 1;
   score *= index;
   return score;
}
int main(){
   string str[] = { "learn", "programming", "tutorials", "point" };
   int n = sizeof(str) / sizeof(str[0]);
   string s = str[0];
   for(int i = 0; i<n; i++){
      s = str[i];
      cout<<"The score of string ' "<<str[i]<<" ' is "<<strScore(str, s, n, i+1)<<endl;
   }
   return 0;
}

実行結果

The score of string ' learn ' is 50
The score of string ' programming ' is 262
The score of string ' tutorials ' is 405
The score of string ' point ' is 296

まとめ

このように、文字ごとのアルファベット値は「s[j] - 'a' + 1」という式で簡単に求められます。計算量は文字列の総文字数に比例する O(N) となり、非常に効率的です。文字列処理の基本的なテクニックの一つなので、ぜひマスターしておきましょう。

  1. C++でsprintfに相当する処理を行う方法:ostringstreamの使い方を解説

    C++におけるsprintf()関数とはsprintf()関数は、C言語とC++の両方に存在する標準ライブラリ関数です。この関数は、書式指定したデータを文字列に格納するために使用されます。構文はprintf()関数とよく似ていますが、唯一の違いは、出力先として文字列(バッファ)を指定する必要がある点です。一方、C++ではより型安全で柔軟な方法として、ostringstream(出力文字列ストリーム)を使って同じ処理を実現できます。ostringstreamは「output string stream」の略で、<sstream>ヘッダファイルで定義されています。ostringstre

  2. C++で文字列の長さを求める方法:基本テクニックとstrlen()関数の使い方

    C++における文字列とは、ヌル文字(\0)で終端される1次元の文字配列のことです。文字列の長さとは、このヌル文字より前に存在する文字数を指します。例えば、次のような文字列を考えてみましょう。char str[] = The sky is blue; 上記の文字列に含まれる文字数 = 15それでは、文字列の長さを求めるプログラムを見ていきましょう。例1:whileループを使って文字数をカウントする方法#include<iostream> using namespace std; int main() {    char str[] = Apple; &n