From hisa@t3.rim.or.jp Fri May 14 22:47:08 1999 Received: from wise13.mn.waseda.ac.jp (wise13.mn.waseda.ac.jp [133.9.4.145]) by newton.kashi.info.waseda.ac.jp (8.8.8/3.7W) with ESMTP id WAA04296 for ; Fri, 14 May 1999 22:47:07 +0900 (JST) Received: from wise20.mn.waseda.ac.jp (wise20.mn.waseda.ac.jp [133.9.4.141]) by wise13.mn.waseda.ac.jp (8.9.1a/3.7W-19980811) with ESMTP id WAA12069 for ; Fri, 14 May 1999 22:36:11 +0900 (JST) Received: from wise13.mn.waseda.ac.jp (wise13.mn.waseda.ac.jp [133.9.4.145]) by wise20.mn.waseda.ac.jp (8.9.1+3.0W/3.7W-19981111) with ESMTP id WAA02944 for ; Fri, 14 May 1999 22:36:11 +0900 (JST) Received: from mail.t3.rim.or.jp (root@mail.t3.rim.or.jp [202.247.130.69]) by wise13.mn.waseda.ac.jp (8.9.1a/3.7W-19980811) with ESMTP id WAA12055 for ; Fri, 14 May 1999 22:36:09 +0900 (JST) Received: from rim (ppp094.t3.rim.or.jp [202.247.160.94]) by mail.t3.rim.or.jp (8.8.8/3.6W-RIMNET-98-06-09) with SMTP id WAA17374 for ; Fri, 14 May 1999 22:36:08 +0900 (JST) From: "H.Ishikawa" To: Subject: =?iso-2022-jp?B?W0pTSjk5XRskQj1QQmpGfCEnGyhCNC8yMiwbJEJEcz1QRnwhJxsoQjUv?= =?iso-2022-jp?B?MTQ=?= Date: Fri, 14 May 1999 22:37:32 +0900 Message-ID: <000001be9e0e$eb45bf20$5ea0f7ca@rim> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook 8.5, Build 4.71.2173.0 Importance: Normal X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3 Status: OR /*/////////////////////////////////////////////////////////*/ /* 4個の数字と3個の四則演算で10になる組み合わせを考えるプログラム */ /*/////////////////////////////////////////////////////////*/ /* ////// g97p0093 /////*/ /* ////// 石川 広男 //// */ /* ///////////////////// */ #include /*-- 数字と演算を表現する --*/ typedef struct{ int num[4] /*数字*/, sum[4], /*合計*/ flag; char cul[3]; /*演算*/ }number; /*-- 数字の重複を判定 --*/ typedef struct{ int mode; /*0:重複0個, 1:重複2個,*/ /* 2:重複3個, 3:すべて同じ数字*/ int num; }repeat; /*---------------------------------------------------------------------*/ number current; int n = 0; int num_defined[4]; /*ユーザーの入力*/ /*-- 数字の順番を入れ替える関数 mode:0,1 --*/ int num_change_0(void){ int i, j = 1, tmp; if(current.flag % 6 == 0){ current.num[0] = num_defined[current.flag/6]; for(i=0;i<4;i++){ if(i != current.flag/6){ current.num[j] = num_defined[i]; j++; } } return (0); } else{ if(current.flag%2 == 1){ tmp =current.num[2]; current.num[2] = current.num[3]; current.num[3] = tmp; } else{ tmp = current.num[1]; current.num[1] = current.num[2]; current.num[2] = tmp; } return (0); } } /*-- 数字の順番を入れ替える関数 mode:2 --*/ int num_change_2(void){ int tmp; if(current.flag == 0){ current.num[0] = num_defined[0]; current.num[1] = num_defined[1]; current.num[2] = num_defined[2]; current.num[3] = num_defined[3]; return (0); } else{ tmp = current.num[3-current.flag%4]; current.num[3-current.flag%4] = current.num[4-current.flag%4]; current.num[4-current.flag%4] = tmp; return (0); } } /*-- 出力関数(cul) --*/ void num_print(void){ printf("((%2d %c%2d) %c%2d) %c%2d\n", current.num[0],current.cul[0], current.num[1],current.cul[1], current.num[2],current.cul[2], current.num[3]); } /*-- 出力関数(cul2) --*/ void ex_print(void){ printf("(%2d %c%2d) %c (%2d %c%2d)\n", current.num[0],current.cul[0], current.num[1],current.cul[1], current.num[2],current.cul[2], current.num[3]); } /*-- 組み合わせを計算する関数 --*/ void cul(void){ current.sum[n+1] = current.sum[n] + current.num[n+1]; current.cul[n] = '+'; if(n == 2 && current.sum[3] == 10) num_print(); else if(n < 2){ n++; cul(); } current.sum[n+1] = current.sum[n] - current.num[n+1]; current.cul[n] = '-'; if(n == 2 && current.sum[3] == 10) num_print(); else if(n < 2){ n++; cul(); } current.sum[n+1] = current.sum[n] * current.num[n+1]; current.cul[n] = '*'; if(n == 2 && current.sum[3] == 10) num_print(); else if(n < 2){ n++; cul(); } if(current.sum[n] % current.num[n+1] == 0){ current.sum[n+1] = current.sum[n] / current.num[n+1]; current.cul[n] = '/'; if(n == 2 && current.sum[3] == 10) num_print(); else if(n < 2){ n++; cul(); } } n--; } /*-- 組み合わせを計算する関数 cul2(), cul2a(), cul2b() --*/ void cul2b(void){ current.sum[2] = current.sum[1] * current.sum[3]; current.cul[1] = '*'; if(current.sum[2] == 10) ex_print(); if(current.sum[1] % current.sum[3] == 0){ current.sum[2] = current.sum[1] / current.sum[3]; current.cul[1] = '/'; if(current.sum[2] == 10) ex_print(); } } void cul2a(void){ current.sum[3] = current.num[2] + current.num[3]; current.cul[2] = '+'; cul2b(); current.sum[3] = current.num[2] - current.num[3]; current.cul[2] = '-'; cul2b(); } void cul2(void){ current.sum[1] = current.num[0] + current.num[1]; current.cul[0] = '+'; cul2a(); current.sum[1] = current.num[0] - current.num[1]; current.cul[0] = '-'; cul2a(); } main(){ int box,i; repeat m; /* 初期設定 */ m.mode = 0; current.flag = 0; current.sum[3] = 0; /* ユーザーからの入力 */ printf("0から9までの数字を4つ入力して下さい。\n"); printf("-->"); scanf("%d",&box); printf("計算結果\n"); /* 数を配列に変換(重複する数字を検索する)*/ num_defined[0] = box / 1000; num_defined[1] = box % 1000 / 100; if(num_defined[0] == num_defined[1]){ m.mode = 1; m.num = num_defined[0]; } num_defined[2] = box % 1000 % 100 / 10; if(m.num == num_defined[2]) m.mode = 2; else if(num_defined[1] == num_defined[2]){ m.mode = 1; m.num =num_defined[1]; } num_defined[3] = box % 1000 % 100 % 10; if(m.mode == 2 && m.num == num_defined[3]) m.mode = 3; else if(m.mode == 1 && m.num == num_defined[3]) m.mode = 2; else if(num_defined[2] == num_defined[3]){ m.mode = 1; m.num = num_defined[2]; } /* MODE毎に計算 */ if(m.mode == 0 || m.mode == 1){ for(current.flag = 0; current.flag < 24; current.flag++){ n = 0; num_change_0(); current.sum[0] = current.num[0]; cul(); cul2(); } } if(m.mode == 2){ for(current.flag = 0; current.flag < 4; current.flag++){ n = 0; num_change_2(); current.sum[0] = current.num[0]; cul(); } } if(m.mode == 3){ n=0; for(i = 0; i < 4; i++) current.num[i] = num_defined[0]; current.sum[0] = current.num[0]; cul(); } }