質問 3: 関数 void fun(int x, int pp[], int *n) を書いてください。その機能は、x を割り切れる偶数ではない整数を見つけて、昇順に pp に入れることです。指定された配列内のこれらの約数は、仮パラメータ n によって返されます。

画像の説明を追加してください

C テストの問題

質問3请编写函数void fun(int x,int pp[],int *n),它的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。

ChatGPT は次のように答えます。

以下の知識点が主に調査されました。

  1. ループ ステートメント:for整数 1 ~ をループするために使用しますx
  2. 分岐文:if条件判定文を使用して現在の数値が偶数であるかどうかを判定し、スキップします。
  3. 配列:x割り切れるが偶数ではない整数を昇順に並べて格納するために使用されます。
  4. ポインタ:pp整数配列の長さを返すために使用されます。

これらの知識は C 言語の比較的基本的な内容であり、これらを十分に習得することは、高品質な C 言語プログラムを作成するために非常に重要です。

プログラムの問題解決のアイデア:

このプログラムの問題解決の主なアイデアは次のとおりです。

  1. 最初にforを使用して、整数 1 からx;までをループします。
  2. 各整数について、if条件判定ステートメントを使用して現在の数値が偶数かどうかを判定し、偶数の場合はスキップします。
  3. 現在の数値が割り切れxず偶数でない場合は、それをpp配列に格納します。
  4. 最後に、pp整数配列の長さが返されます。

解決策 1:

#include <stdio.h>

void fun(int x, int pp[], int *n) {
    
    
    int cnt = 0;
    for (int i = 1; i <= x; i++) {
    
    
        if (i % 2 == 0) continue;
        if (x % i == 0) {
    
    
            pp[cnt++] = i;
        }
    }
    *n = cnt;
}

int main() {
    
    
    int x = 24;
    int pp[100];
    int n;
    fun(x, pp, &n);

    printf("The divisors of %d that are odd are:\n", x);
    for (int i = 0; i < n; i++) {
    
    
        printf("%d ", pp[i]);
    }
    printf("\n");

    return 0;
}

このうち、fun関数のパラメータは次のように説明されます。

  • x: 解くべき数値。
  • ppx: 割り切れる偶数ではない整数を降順に並べて格納するために使用されます。
  • n:pp整数配列の長さ。

関数の実装アイデアはfun次のとおりです。

  1. カウンタをcnt0 に初期化します。
  2. 1 から までトラバースしx、現在の数値が偶数かどうかを判断し、偶数であればスキップします。
  3. 現在の数値が のx因数であるかどうかを判断し、そうであればそれをpp配列に格納し、cntカウンターに 1 を追加します。
  4. 走査後、cntカウンタの値がポインタ変数に割り当てられnpp配列の長さを示します。

上のコードに示すように、関数内でmain関数を呼び出してfun結果を出力できます。

はい、この機能を実現するには他にも C 言語コードを記述する方法がありますが、参考までに 2 つの異なる実装方法を以下に示します。

解決策 2:

#include <stdio.h>

int fun(int x, int pp[])
{
    
    
    int i, j = 0;
    for (i = 1; i <= x; i++) {
    
    
        if (i % 2 == 0) {
    
    
            continue;
        }
        if (x % i == 0) {
    
    
            pp[j++] = i;
        }
    }
    return j;
}

int main()
{
    
    
    int x = 12, pp[100], n, i;
    n = fun(x, pp);
    for (i = 0; i < n; i++) {
    
    
        printf("%d ", pp[i]);
    }
    printf("\n");
    return 0;
}

解決策 3:

#include <stdio.h>

int fun(int x, int pp[])
{
    
    
    int i, j;
    j = 0;
    for (i = 1; i <= x; i++) {
    
    
        if (i % 2 == 0) {
    
    
            continue;
        }
        if (x % i == 0) {
    
    
            *(pp + j) = i;
            j++;
        }
    }
    return j;
}

int main()
{
    
    
    int x = 12, pp[100], n, i;
    n = fun(x, pp);
    for (i = 0; i < n; i++) {
    
    
        printf("%d ", *(pp + i));
    }
    printf("\n");
    return 0;
}

これら 2 つの実装の主な違いは、配列要素のアクセス メソッドが異なり、最初のメソッドが使用されpp[i]、2 番目のメソッドが使用されることです*(pp + i)ただし、実装の考え方は同じで、すべて 1 をループしてx各数値が偶数かどうかを判断し、偶数で割り切れない場合は配列にx格納し、配列の長さを返します。pp

答えに満足したら、修正してください。

おすすめ

転載: blog.csdn.net/zp1990412/article/details/130721606