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

【C言語】数値Nと最大の奇数の桁との積を求める方法

問題概要

ある数値Nが与えられたとき、Nとその各桁の中で最も大きい奇数との積を求める必要があります。もし奇数の桁が一つも存在しない場合は、-1を出力します。

例えば、Nを「153」で初期化した場合、この数に含まれる最大の奇数の桁は5なので、結果は153 × 5 = 765となります。一方、「246」のように奇数の桁がまったく含まれていない数の場合は、出力は-1となります。

入力 − N = 198

出力 − 1782

説明 − 198 × 9 = 1782

入力 − N = 15382

出力 − 76910

説明 − 15382 × 5 = 76910

問題を解くためのアプローチ

この問題は、以下の手順で解決できます。

  • 入力として数値Nを受け取ります。

  • Nのすべての桁を走査し、奇数の桁を探します。

  • 見つかった奇数の桁の中から最大のものを特定します。

  • 元の数値Nと最大の奇数の桁を掛け合わせます。

  • 奇数の桁が一つも存在しない場合は、結果を-1に更新します。

  • 最終的な結果を返します。

アルゴリズム

開始
関数 int largestodd(int n) 内
  ステップ1→ 変数largeを宣言し、-1で初期化する
  ステップ2→ n > 0 の間ループを繰り返す
    digit に n % 10 を代入する
    もし digit % 2 == 1 かつ digit > large ならば、
      large に digit を代入する
    n に n / 10 を代入する
  ステップ3→ large を返す
関数 int findproduct(int n) 内
  ステップ1→ 変数largeを宣言し、largestodd(n) の戻り値で初期化する
  ステップ2→ もし large == -1 ならば、
    -1 を返す
  ステップ3→ (n * large) を返す
関数 int main() 内
  ステップ1→ n を 15637 で初期化する
  findproduct(n) を呼び出した結果を出力する
終了

サンプルコード(C言語)

#include <stdio.h>
int largestodd(int n){
    // すべての桁が偶数の場合は
    // -1 を返す
    int large = -1;
    while (n > 0) {
        // 最下位の桁から順に確認する
        int digit = n % 10;
        // 現在の桁が奇数であり、
        // かつ large より大きい場合
        if (digit % 2 == 1 && digit > large)
            large = digit;
        n = n / 10;
    }
    // n の最大の
    // 奇数の桁を返す
    return large;
}
int findproduct(int n){
    int large = largestodd(n);
    // n に奇数の桁が含まれない場合
    if (large == -1)
        return -1;
    // n とその最大の奇数の桁との積
    return (n * large);
}
int main(){
    int n = 15637;
    printf("%d\n", findproduct(n));
    return 0;
}

出力

上記のコードを実行すると、以下の出力が得られます −

109459

この例では、15637に含まれる奇数の桁は「1」「5」「3」「7」であり、その中で最大の奇数は7です。したがって、15637 × 7 = 109459が出力されます。

まとめ

本記事では、C言語を用いて数値Nとその最大の奇数の桁との積を求める方法を紹介しました。ポイントは、n % 10で最下位の桁を取り出しながらn / 10で数を縮めていくことで、全桁を効率的に走査できる点です。奇数の桁が存在しないケースでは-1を返すことで、エラー状態を明確に区別できる実装になっています。時間計算量はO(d)(dは桁数)、空間計算量はO(1)と非常に効率的です。

  1. 【C言語】奇数次正方行列の中央の行と列の積を求める方法

    はじめに 正方行列 mat[row][column](行数と列数が等しい行列)を考えます。このとき、行と列の長さが奇数、つまり 2 で割り切れない値である場合、その行列の中央の行と中央の列に含まれる各要素の積を求めるのが本記事の目的です。 たとえば下図のような 3×3 の行列では、2 行目が中央の行、2 列目が中央の列に相当します。 制約条件 入力は必ず正方行列(行数 = 列数)であること。 行と列の長さは必ず奇数であること。 入出力例 例 1 入力: mat[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 出力: 中央の行の積 = 120 中央の列の積

  2. Google、Pixel 2で約束を果たす――機械学習が融合した新世代スマートフォンの実力

    Google、Pixel 2で約束を果たすスマートフォン市場における比較的新しい存在であるGoogleは、2017年10月4日のPixel 2発表により、業界のハードルをさらに引き上げました。第2世代となる同デバイスには、革新的かつ着実なアップグレードが数多く盛り込まれています。Googleのプロダクトマネジメント担当バイスプレジデント、マリオ・ケイロス氏は「私たちは現状に疑問を抱くことを信条としている」と語りました。同氏によれば、Pixel 2とPixel 2 XLはソフトウェア、ハードウェア、AIの最高の融合体だといいます。Googleの戦略は、機械学習と連携して動作するハードウェアを作る