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

すべての数値ペアのGCDがKとなるN行の数列を出力する方法


GCD(最大公約数)とは

GCDは「Greatest Common Divisor(最大公約数)」の略で、0以外の2つ以上の整数に共通する約数の中で最も大きいものを指します。

例として、48と180の最大公約数を求めてみましょう。

48 = 2 × 2 × 2 × 2 × 3

180 = 2 × 2 × 3 × 3 × 5

すべての数値ペアのGCDがKとなるN行の数列を出力する方法

両方の数に共通する素因数は「2 × 2 × 3」であるため、最大公約数は次のように計算できます。

最大公約数 = 2 × 2 × 3 = 12

問題の概要

本記事で扱う問題では、指定された値Kを最大公約数とする要素を含むN行の数列を出力します。各行に含まれるどの2つの数を選んでも、そのGCDが必ずKになるようにするのがポイントです。

入力:N=2 GCD=2
出力:2-4-6-10
14-16-18-22

この出力では、1行目の「2・4・6・10」から任意の2つを選んで組み合わせても(例:2と4、4と10など)、GCDはすべて2になっています。

アルゴリズム

この問題は「6i+1」「6i+2」「6i+3」「6i+5」という形の数を活用することで解決できます。これらの数は互いに素(GCDが1)の関係にあるため、それぞれにKを掛けることで、任意のペアのGCDが必ずKになります。

START
Step 1 -> 整数n(例:2)とk(例:2)、およびループ変数iをint型として宣言する
Step 2 -> iを0からn未満までループさせる
    Print (k * (6 * i + 1))
    Print (k * (6 * i + 2))
    Print (k * (6 * i + 3))
    Print (k * (6 * i + 5))
    改行(\n)を出力
Step 3 -> ループ終了
STOP

C言語による実装例

#include<stdio.h>
int main() {
    int i,n = 2, k = 2;
    for (i = 0; i < n; i++) {
        printf("%d-",(k * (6 * i + 1)));
        printf("%d-",(k * (6 * i + 2)));
        printf("%d-",(k * (6 * i + 3)));
        printf("%d",(k * (6 * i + 5)));
        printf("\n");
    }
    return 0;
}

このコードでは、行数n=2、目標のGCDであるk=2を設定しています。for文のループ内で「6i+1」「6i+2」「6i+3」「6i+5」にそれぞれkを掛けた値を順番に出力し、1行分の出力が完了するごとに改行しています。

出力結果

上記のプログラムを実行すると、以下の出力が得られます。

2-4-6-10
14-16-18-22

結果を確認すると、1行目の「2・4・6・10」のどの2つの数を選んでも最大公約数は2、2行目の「14・16・18・22」も同様にすべてのペアのGCDが2となっており、条件どおりの動作をしていることがわかります。

  1. C言語で非平方数(完全平方数以外の数)を出力する方法

    プログラムの概要ある数の「平方」とは、その数にその数自身を掛け合わせた値のことです。「平方数」または「完全平方数」とは、ある整数を二乗することで得られる整数を指します。完全平方数は自然数を二乗した数であり、具体的には以下のような数になります。1, 4, 9, 16, 25, 36, 49, 64, 81, 100以下は、1から100までの各完全平方数とその平方根の一覧です。√1 = 1 (12 = 1 であるため) √4 = 2 (22 = 4 であるため) √9 = 3 (32 = 9 であるため) √16 = 4 (42 = 16 であるため) √25 = 5 (52 = 25 であるため

  2. Cプログラムで行列を対角パターンに沿って数値出力する方法

    この課題は、n×nの行列を対角パターンで出力することです。 例えば n が 3 の場合、対角パターンに従って行列を出力すると、次のような配置になります。 そして、実際の出力結果は以下の通りです。 実行例 Input: 3 Output: 1 2 4 3 5 7 6 8 9 Input: 4 Output: 1 2 4 7 3 5 8 11 6 9 12 14 10 13 15 16 考え方 一見すると、「数値 n を受け取り n×n の行列を生成し、それを対角方向に走査しながら別の行列へ値を格納する」というアプローチが思い浮かびます