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

C++で偶数番目と奇数番目の桁の合計を求める方法

偶数番目と奇数番目の桁の合計とは

整数 N が与えられたとき、左から数えて奇数番目の桁の数字の合計と、偶数番目の桁の数字の合計をそれぞれ求めることを考えます。例えば、数値が 153654 の場合、odd_sum(奇数番目の合計)は 9、even_sum(偶数番目の合計)は 15 となります。

具体的には、奇数番目の桁は 1 + 3 + 5 = 9、偶数番目の桁は 5 + 6 + 4 = 15 となります。

解法のアプローチ

この問題を解くには、最下位の桁から順にすべての桁を取り出していきます。ここで重要なポイントは、元の数値の桁数が奇数であれば最下位の桁は奇数番目の位置にあり、桁数が偶数であれば偶数番目の位置にあるという点です。

1桁処理するごとに状態を奇数から偶数へ、偶数から奇数へと切り替えることで、各桁がどちらの位置に属するかを簡単に判定できます。

サンプルコード

#include<iostream>
using namespace std;
bool isOdd(int x){
   if(x % 2 == 0)
   return false;
   return true;
}
void getSum(int n) {
   bool odd_check = isOdd(n);
   int odd_sum = 0, even_sum = 0;
   while (n != 0) {
      if (odd_check)
         odd_sum += n % 10;
      else
         even_sum += n % 10;
      odd_check = !odd_check;
      n /= 10;
   }
   cout << "Sum odd : " << odd_sum << endl;
   cout << "Sum even : " << even_sum;
}
int main() {
   int n = 153654;
   getSum(n);
}

実行結果

Sum odd : 9
Sum even : 15

コードの解説

isOdd 関数: 引数として受け取った数値が奇数かどうかを判定します。2 で割った余りが 0 であれば偶数なので false を返し、それ以外は true を返します。

getSum 関数: まず isOdd 関数を使って元の数値の桁数の偶奇を判定し、最下位の桁が奇数番目か偶数番目かを決定します。その後、while ループの中で以下の処理を繰り返します。

  • n % 10 で最下位の桁を取り出し、現在の状態に応じて odd_sum または even_sum に加算する
  • odd_check を反転させて、次の桁の位置の偶奇を切り替える
  • n /= 10 で最下位の桁を削除する

計算量: 処理は桁数に比例するため、時間計算量は O(log₁₀N) となります。非常に効率的なアルゴリズムです。

まとめ

桁数の偶奇を事前に判定し、最下位の桁から交互に加算していくことで、偶数番目と奇数番目の桁の合計を簡単に求めることができます。この手法は、桁ごとの処理が必要な他の問題にも応用できる基本的なテクニックです。

  1. 【C++】ある数の偶数の素因数の合計を効率的に求める方法

    はじめにこの記事では、ある整数の「偶数の素因数」の合計を効率的に求める方法を解説します。例として、n = 480 という数を考えてみましょう。480 を素因数分解すると、2、2、2、2、2、3、5 となります。このうち偶数である素因数は 2 のみなので、その合計は 2+2+2+2+2 = 10 になります。一見すると、すべての因数を列挙して偶数かどうか判定する必要があるように思えますが、実はもっとシンプルな方法で解けます。解法のポイント偶数の素因数は 2 しか存在しない、という点が重要です。これを利用すると、次の手順で問題を解くことができます。数が 2 で割り切れる間、そのたびに合計に 2 を

  2. C++で数値の各桁の合計を計算するプログラム

    ここでは、C++言語を使用して入力された整数の各桁の合計を計算する方法を紹介します。剰余演算子と整数除算を組み合わせたシンプルなアルゴリズムで実装できます。 プログラム例 #include<iostream> using namespace std; int main() {    int x, s = 0;    cout << Enter the number : ;    cin >> x;    while (x != 0) {