0

数字の 1 から 9 を使用して、同じ数字を繰り返さずに、2 つの数字を足し合わせて、各合計の可能なすべての組み合わせで構成された合計の表を作成しました。C でプログラムを作成して、2 桁とそれぞれの組み合わせを加算してすべての合計を見つけ、このグラフを印刷しようとしています。for ループを使用してこのプログラムを作成しようとしていますが、スタックしてしまいました。最初の最初の合計を印刷することはできますが、今は困惑している組み合わせを取得しています。正しい軌道に乗っているかどうかはわかりません。どんな提案や助けも大歓迎です。私のチャート、これまでに作成されたコード、および現在のコードの出力は以下のとおりです。

これが私のプログラムでやりたいことです:

このチャートには、2 桁で構成されるすべての合計と、各合計を構成するすべての可能な組み合わせがリストされています。

    2 Digit Sums
Sum Combinations
3   1+2
4   1+3
5   1+4, 2+3
6   1+5, 2+4
7   1+6, 2+5, 3+4
8   1+7, 2+6, 3+5
9   1+8, 2+7, 3+6, 4+5
10  1+9, 2+8, 3+7, 4+6
11  2+9, 3+8, 4+7, 5+6
12  3+9, 4+8, 5+7
13  4+9, 5+8, 6+7
14  5+9, 6+8
15  6+9, 7+8
16  7+9
17  8+9

これは私がうまく書くことができたコードです:

/* Thus program uses the digits 1 - 9 to find all possible sums composed of two
digits, non repeating, and all possible combinations of digits to obain the sums. */
#include<stdio.h>
int main(void)
{
    int S, A, B;
    A = 1;
    B = A + 1;
    S = A + B;
    printf("\t\t2 Digit Sums\n\n");
    printf("Sum\tCombinations\n");
    for(B; B <= 8; ++B)
    {
        S = A + B;
        printf("%d\t%d + %d\n", S, A, B);
    }
    for(A; (A < B && A !=B); ++A)
    {
        S = A + B;
        printf("%d\t%d + %d\n", S, A, B);
    }       
    return(0);
}

これは私のコードの出力です:

                2 Digit Sums
Sum     Combinations
3       1 + 2
4       1 + 3
5       1 + 4
6       1 + 5
7       1 + 6
8       1 + 7
9       1 + 8
10      1 + 9
11      2 + 9
12      3 + 9
13      4 + 9
14      5 + 9
15      6 + 9
16      7 + 9
17      8 + 9
Press any key to continue...
4

1 に答える 1

1

このように問題の範囲が限られている場合は、力ずくで解決できます。すべて試してみてください。チェックするバリエーションは 17 * 9 * 9 だけで、それほど多くはありません。

ループが 3 つある場合 (疑似コード):

for each value of possible_sum (2-17)

    print possible_sum

    for each value of addend1 (1-9)

       for each value of addend2 (1-9) 

       if ( addend1 + addend2 = possible_sum ) 
       then

           print addend1 and addend2

       end if

       end for addend2

    end for addend1

end for possible_sum

残されている問題は、対称解 (4+5 と 5+4) を削除する方法を見つけることです。解のパターンを見れば簡単です (最初の加数が 2 番目の加数にどのように関係しているかに注意してください)。慎重に考えれば、この強引な方法でも高速化する方法はたくさんあります。

より大きなデータセット (「すべての 3 桁の加数...」) では、より優れたアルゴリズムが必要になります。

于 2012-11-28T17:18:38.777 に答える