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

C++で最初のN個のイッカノビフ(Iccanobif)数を求めるプログラム

このチュートリアルでは、最初のN個のイッカノビフ(Iccanobif)数を求めるC++プログラムについて解説します。

整数Nが与えられ、その位置までのイッカノビフ数をすべて出力することが課題となります。イッカノビフ数はフィボナッチ数と非常によく似た数列ですが、決定的な違いがひとつあります。それは、直前の2つの数を加算する前に、それぞれの桁を反転(逆順)させるという点です。

アルゴリズムの流れ

  • 数列は0と1から始まります。
  • 3項目以降は、「直前の2つの数の桁をそれぞれ反転した値の和」を新しい項として追加します。
  • 例えば、13の次の項は reverse(8) + reverse(13) = 8 + 31 = 39 となり、さらにその次は reverse(13) + reverse(39) = 31 + 93 = 124 となります。

C++での実装例

#include <bits/stdc++.h>
using namespace std;

// 数値の桁を反転する関数
int reverse_digits(int num){
    int rev_num = 0;
    while (num > 0) {
        rev_num = rev_num * 10 + num % 10;
        num = num / 10;
    }
    return rev_num;
}

// 最初のN個のイッカノビフ数を出力する関数
void icanobifNumbers(int N){
    int first = 0, second = 1;
    if (N == 1)
        cout << first;
    else if (N == 2)
        cout << first << " " << second;
    else {
        cout << first << " " << second << " ";
        for (int i = 3; i <= N; i++) {
            int x = reverse_digits(first);
            int y = reverse_digits(second);
            cout << x + y << " ";
            int temp = second;
            second = x + y;
            first = temp;
        }
    }
}

int main(){
    int N = 12;
    icanobifNumbers(N);
    return 0;
}

実行結果

0 1 1 2 3 5 8 13 39 124 514 836

コードの解説

reverse_digits関数は、引数として受け取った整数の桁を反転して返す補助関数です。10で割った余りを順に取り出しながら新しい数を組み立てていくことで、桁を逆順に並べ替えています。

icanobifNumbers関数は、最初の2項である0と1を出力した後、3項目以降をforループで順に計算していきます。各ステップでは、直前の2つの値(first・second)をそれぞれ反転し、その和を新しい項として出力すると同時に変数を更新して、次の計算に備えます。

また、Nが1の場合は0のみ、Nが2の場合は「0 1」のみを出力するよう、条件分岐で適切に処理されています。

  1. C++で2つの等差数列の最初の衝突点(共通項)を求める方法

    この記事では、2つの等差数列に共通して現れる最初の値――いわゆる「衝突点(コリジョンポイント)」――を見つけるC++プログラムについて解説します。問題の概要まず、5つの変数「a」「b」「c」「d」「n」が与えられます。これらの変数をもとに、それぞれn項からなる次の2つの等差数列(算術級数)を作成します。b, b+a, b+2a, …, b+(n−1)ad, d+c, d+2c, …, d+(n−1)cそのうえで、この2つの数列の両方に共通して含まれる最初の値を求めることが目的です。解法のアプローチこの問題は、次の手順で解くことができます。第1の数列の項を先頭から順に1つずつ生成します。生成した

  2. 【C++】n個の数値からなる集合Sの中で、中央値に最も近いk個の数を見つける方法

    本記事では、n個の数値からなる集合Sが与えられたとき、その中央値(メジアン)に最も近いk個の数を求めるC++プログラムを紹介します。この問題は、まずクイックソートでデータを並べ替え、その後中央値を基準として左右にポインタを広げながら近い順に要素を選んでいくというアプローチで解くことができます。アルゴリズムの概要処理は大きく分けて「パーティション(分割)」「クイックソート」「中央値からの探索」の3段階で構成されます。1. partition関数:配列の分割配列a[]の末尾の値(high)をピボットとして扱い、それより小さい要素を左側に集めることで配列を分割します。Begin functi