トランプの和と積のパズル 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; }