最小行で逝ってみる。(C言語)

1稲垣事故"朗
<お題:小町算>
1,2,3,4,5,6,7,8,9(数字の並びは固定)である。
これらの数の間に+、-、何も入れないという演算子をいれて、計算
する。そして、計算結果が100になる組み合わせを、すべて表示する
プログラムを作成せよ。100になるのは、12とうりのはず。
(夏休みの課題だ。今のところ27行。)
<注意>
1行に2文以上書かない。
ヘッダー、DLL,COM,など、ソースレベルおよびバイナリレベルの外部ルーチン
は禁止する。
ソースコードは、すべてカウントする。(コメント、ヘッダなど)
プログラムは、コンソールアプリケーションとする。
入出力は、ストリーム入出力を使用する。

誰かたすけて~。小町算中毒に・・・
君なりに27行で書けたならそれで良いじゃないか。
課題なんだし自分でやったのを胸を張って提出すれば?
>>1
>何も入れないという演算子

ごめん、それなに?
2 3 だったら二十三ということ?
4デフォルトの名無しさん:01/08/26 16:40
>入出力は、ストリーム入出力を使用する。

これだとタイトルの(C言語)というのはウソになるね・・・。
5デフォルトの名無しさん:01/08/26 16:41
>>4
演算部はCで実装しろってことじゃない?
何の意味があるのかわからないが。
6旧態依然:01/08/26 16:43
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int i, s, sign[10];
 long n, x;
 for (i = 1; i <= 9; i++) sign[i] = -1;
 do {
  x = n = 0; s = 1;
  for (i = 1; i <= 9; i++)
   if (sign[i] == 0) n = 10 * n + i;
   else {
    x += s * n; s = sign[i]; n = i;
   }
  x += s * n;
  if (x == 100) {
   for (i = 1; i <= 9; i++) {
    if (sign[i] == 1) printf(" + ");
    else if (sign[i] == -1) printf(" - ");
    printf("%d", i);
   }
   printf(" = 100\n");
  }
  i = 9; s = sign[i] + 1;
  while (s > 1) {
   sign[i] = -1; i--; s = sign[i] + 1;
  }
  sign[i] = s;
 } while (sign[1] < 1);
 return EXIT_SUCCESS;
}
[1] 1+2+3+4+5+6+7+8*9 = 100
[2] 1+2+3-4+5+6+78+9 = 100
[3] 1+2+3-4*5+6*7+8*9 = 100

[99] 123-4-5-6-7+8-9 = 100
[100] 123+45-67+8-9 = 100
[101] 123-45-67+89 = 100
Googleで検索したらわんさかでてくるな。2chで聞かないでも
どうにでもなる話なんじゃないのか?
>>1
12通りじゃ幾らなんでも少なすぎでしょ。正解が出てこそナンボ、
不正解プログラムが短くても意味無いと思う。

>これらの数の間に+、-、何も入れないという演算子をいれて

と"数の間"いうことは、数式先頭のマイナス符号は無効なのかね?
その場合101通り。先頭のマイナスを認めれば162通りか。
>>9
符号は正負だけらしいよ・・・(笑
11デフォルトの名無しさん:01/08/26 17:10
6 はgcc だと通らない。
12デフォルトの名無しさん:01/08/26 17:11
>これらの数の間に+、-、何も入れないという演算子をいれて
「数の間」が課題なら、答えは11通りだね。先頭の単項演算を考慮して12通り。
>>1の出題内容と自己の解はアンマッチ。
131です。:01/08/26 17:30
先頭の単項演算を考慮して12通りでした。
あと、何も入れないとは78とか123とかです。
説明不足でもうしわけありません。
私は6さんの考え方に近いです。
「自分でやれ!」という意見もあるかと思いますが、ごもっともです。
考え込んで2週間がたちました。27行から減りません。
夏休みもあとわずかになりました。どうかお力を貸してください。
よろしくお願い致します。
14デフォルトの名無しさん:01/08/26 22:43 ID:.2cACfus
>>13
なんか>>2と同じことを書くけど、何行だかしらんがとにかく
自分で書けたなら、それで十分じゃないかと思うのだが。
15デフォルトの名無しさん:01/08/27 17:01 ID:NEa0N4C6
そう。そして、自分の実力はこの程度なのだと実感し、
さらに精進に励むのだ。
16デフォルトの名無しさん:01/08/27 17:54 ID:cXXJEOdY
7行スレで訊いてみては如何
17デフォルトの名無しさん:01/08/27 18:09 ID:q21zzpHo
>>161
7行スレで聞いておいだされたんじゃなかったっけ?
18デフォルトの名無しさん:01/08/27 18:23 ID:cXXJEOdY
>>17 そんなこととはつゆ知らず失礼
19デフォルトの名無しさん:01/08/28 01:14 ID:WV78peY2
#include<stdio.h>
#include<math.h>
#include<string.h>
int main(void){
  long i,j,k,flag,sum,temp,n = 0;
  char sz[128];
  for(i=0;i<(long)pow((double)3,(double)9);i++){
    flag = sum = temp = *sz = 0;
    for(j=0;j<9;j++){
      k = i / (long)pow((double)3,(double)j) % 3 - 2;
      if(j==0 && k==0) break;
      sum = (k==-1) ? sum : (sum + temp * (flag + 1));
      flag = (k==-1) ? flag : k;
      temp = (k==-1) ?(temp * 10 + (j + 1)) : (j + 1);
      *(long *)(sz + strlen(sz)) = (k==-1) ? ('1' + j) : (0x2B - k) + ('1' + j) * 0x100;
    }
    if((sum + temp * (flag + 1))==100) printf("%04d %s = 100\n",++n,sz);
  }
  return 0;
}
20:01/08/28 01:40 ID:MUWorKro
#include<stdio.h>
char s[]=" 1 2 3 4 5 6 7 8 9 =100";
int p=0;
void S(int d, int e, int a, char x)
{
  s[(d-1)*2]=x;
  if(++d>9){
    if(e+a==100)printf("[%2d]%s\n",++p,s);
    return;
  }
  S(d, e+a, d, '+');
  S(d, e+a, -d, '-');
  S(d, e, 10*a+(a>0?d:-d), ' ');
}
int main()
{
  S(1, 0, 1, ' ');
  S(1, 0,-1, '-');
  return 0;
}
211です。:01/08/28 17:00 ID:mSc.uT8s
19さん、20さん、すごいですね。
僕はこういうやり方はまったく思いつきませんでした。
なぜ、このようなやり方でできるのか、どうすれば問題が解決するのか
など大変勉強になります。自分もお二人のプログラムを参考にして、
自分のアルゴリズム能力を向上させていきたいです。
それにしてもすごいですね!!
22デフォルトの名無しさん:01/08/28 18:51 ID:QKtRe60g

>>20
FreeBSDのgccではできない

% gcc 20.c
20.c: In function `S':
20.c:6: syntax error before character 0241
%
23デフォルトの名無しさん:01/08/28 19:00 ID:iPf.P.c2
>>1
行を少なくするというのは
アルゴリズムの本質的な部分と関係ない所の話になってくるので
やっても(無駄とはいわないが)アルゴリズムの勉強にはならないと思う。
24デフォルトの名無しさん:01/08/28 19:49 ID:zBr23uZA
>>22
お前はコンパイルエラー読めないのか?
25デフォルトの名無しさん:01/08/29 17:12 ID:7WZsAq3s
>>1
おまえH○L性だろ。
教師にちくるぞ
26デフォルトの名無しさん:01/08/29 17:30 ID:jrovamws
>>25
H∀L生だな
27デフォルトの名無しさん:01/08/29 18:12 ID:7WZsAq3s
>>1は自分で考えろ。卑怯者。
そのまんま出すとバレるぞ。
28デフォルトの名無しさん:01/08/30 23:07 ID:RU9JH1Zg
19をちょっと分かりやすくしてみたよ。endianにも非依存。
#include <stdio.h>
#include <string.h>
long s[3] = { 0, 1, -1 };
char sgn[3] = {0, '+', '-'};
int main()
{
 long k, n=0;
 for (k = 0; k < 3*3*3*3*3*3*3*3*3; k++) {
  long i, l, c, x=0, d=0;
  char buf[256], *p = buf;
  for (i = l = 1; i <=9; i++, l *= 3) {
   d = (c = (k/l)%3) ? (x += d, s[c] * i) : (d * 10 + (d < 0 ? -i : i));
    (!c || ( *p++ = sgn[c] )) && (*p++ = ('0'+i)) && (*p=0);
  }
  if ((k%3) && x + d == 100) {
   printf("[%d] %s=%d\n", ++n, buf, x+d);
  }
 }
}
29デフォルトの名無しさん:01/08/31 23:14 ID:VrhfaGck
>>27おまえも卑怯だな。(笑)
そのまんま出すわけね~だろボヶ~~~。
30デフォルトの名無しさん:01/08/31 23:35 ID:QT9TNDFg
>>29
変数かえてもアルゴリズムが同じで結局バレ(藁
小町算もわからんようなアホゥには何言っても無駄。
31パル生:01/09/01 00:54 ID:oskLLM56
オレもいただきます(w
あまり人にみられたくないのでsage進行でいこうぜ。
32デフォルトの名無しさん:01/09/01 01:15 ID:ezoDv4b.
>>30
おいおいアルゴリズムなんざどれだけでもかえれるぜ。
発展させていけばいいんだよ。
変数しか変えれないおまえといっしょにするな。
33 ◆VWlu9kUo :01/09/01 01:19 ID:fASDrxFw
>>32
× 変えれない
○ 変えられない
34デフォルトの名無しさん:01/09/01 01:23 ID:ezoDv4b.
おっと。
わりぃ。わりぃ。
35デフォルトの名無しさん:01/09/02 16:59 ID:udxJtb/c
俺もいただき。
どうせ大半のやつらはネットに落ちているソースを改造するのだから。
36デフォルトの名無しさん:01/09/02 22:26 ID:4dvhJnlM
そのまんま出してバレたとしたら
先生が2ちゃんねらってこともバレますね。
37デフォルトの名無しさん:01/09/02 23:10 ID:8MD0AtR2
>>36
もう先生はここ知ってるよ。
38デフォルトの名無しさん:01/09/03 09:10 ID:9o60VuWE
#include <con>
39○岡:01/09/04 16:42 ID:PtDZjrVA
ちゃんとわかってます。
40教師:01/09/06 12:44 ID:7NJjKkl.
今日、生徒に教えられてここに来てみました。
他人のソースプログラムを真似(類似)した生徒は減点対象にします。
もちろんココのソースプログラムも減点対象です。
41教師:01/09/06 12:47 ID:7NJjKkl.
インターネットに落ちているソースプログラムも減点対象です。
42デフォルトの名無しさん:01/09/06 16:55 ID:H3TaFPTk
どっかの問題集からパクッた問題を出すのも減点じゃ
43デフォルトの名無しさん:01/09/06 21:16
これって、問題の書き方が悪いのでもっと短くなる。
>1,2,3,4,5,6,7,8,9(数字の並びは固定)である。
>これらの数の間に+、-、何も入れないという演算子をいれて、計算
>する。
はい、机上で計算しましょう。
>そして、計算結果が100になる組み合わせを、すべて表示する
>プログラムを作成せよ。
はい、机上の計算結果を表示するルーチンのみをプログラムで作成
しましょう。
6行でできるぞ。
#include <stdio.h>
int main()
{
  printf("答え(机上で計算した結果を書いてね)\n");
  return 0;
}
あいまいな問題を出したほうが悪いので上記でも正解になるはず。