at_yasu's blog

ロード的なことを

トランプの和と積のパズル C言語編

C言語で書いてみました〜。何かごちゃごちゃしてしまったけど、こんな感じかな?


問題の出元:http://ja.doukaku.org/34/


以下、ソース。自分でABの値を作っているから、ちょい長い。

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <time.h>
#include <unistd.h>

/* トランプの最大数 */
static unsigned long TRAMP_MAX = 13;

/* 乗算、足し算の結果を溜めておく場所 */
typedef struct _numbers {
    unsigned long multiple; /* ABの値 */
    unsigned long add;      /* A+Bの値 */
} numbers;

/* ---------------------------------------------------------------- */
/* A,B から、AB と A+B の値を作る関数 */
static
numbers createNumbers ()
{
    numbers num = {.multiple=0, .add=0};
    unsigned int A = 0;
    unsigned int B = 0;

    /* AとBが0以外の値になるまでランダムな値を取り出す */
    srand((unsigned)time(NULL));
    while (A == 0 || B == 0) {
        A = (unsigned int)(rand() % TRAMP_MAX);
        B = (unsigned int)(rand() % TRAMP_MAX);
    }

#ifdef __DEBUG__
    fprintf(stdout,"DEBUG: A = %d, B = %d\n",A,B);
#endif

    num.multiple = A*B;
    num.add      = A + B;

    return num;
}

/* AとBの値を探し出す関数 */
void
numberCheck (numbers num)
{
    unsigned long i = 0,j = 0;
    int agari = 1;

    if (num.multiple % 2 == 1) {
        /* 乗算の結果が奇数 = A,Bともに奇数
         * 計算する上では、奇数の値しか見ない様にする
         */
        agari += 1;
    } else {
        /* 乗算の結果が偶数 == A,Bのどちらかが偶数
           もしくはA,B共に偶数
        */
    }

    /* 総当たり・・・orz
     * スマートな方法、思考中
     */
    for (i = 1; i <= num.add; i += agari) {
        for (j = 1; j <= num.add; j += agari) {
            if (i*j == num.multiple &&
                i+j == num.add) {
                fprintf(stdout,"number: A[%ld] B[%ld]\n",i,j);
            }
        }
    }

}

int
main (int argc, char *argv[])
{
    numbers num = {0,0};

    /* 引数が無い場合は、ランダムな値を作って作成する。
     * 引数が二つある場合は、それぞれABの値として読み込み、計算する。
     */
    if (argc == 3) {
        unsigned long A = (unsigned long)atol(argv[1]);
        unsigned long B = (unsigned long)atol(argv[2]);
        if ((A < 1 || A > TRAMP_MAX) ||
            (B < 1 || B > TRAMP_MAX)) {
            num = createNumbers();
        }
        else {
            num.multiple = A*B;
            num.add      = A+B;
        }
    }
    else {
        num = createNumbers();
    }

    fprintf(stdout,"Multiple Number:%ld\n"
            "Addition Number:%ld\n", 
            num.multiple, num.add);
    numberCheck(num);

    return 0;
}