permutation

http://d.hatena.ne.jp/qqqlxl/20060624/p3

(□□-□)/(□□-□□)=15
なる小町算
□には2,3,4,6,7,8,9が入る。

というのがあります。
これを C でキレイに組みたいのですが、どうやるんでしょう?

う〜ん。素直に再帰で書きますか。

#include <stdio.h>

int data[7] = {2,3,4,6,7,8,9};

void swap(int *a, int *b)
{
  int temp;
  temp=*a;
  *a=*b;
  *b=temp;
}

void rec(int* f, int n, void(*r)(int*))
{
  int i;
  if(n<=0)
    {
      r(f);
      return;
    }
  for(i=0;i<n;i++)
    {
      swap(f+i, f+n-1);
      rec(f,n-1,r);
      swap(f+i, f+n-1);
    }
  return;
}

void chk(int *p)
{
  if(p[0]*10+p[1]-p[2]==15*(10*p[3]+p[4]-10*p[5]-p[6]))
    {
      int i;
      for(i=0;i<7;i++)
        printf("%d ",p[i]);
      printf("\n");
    }
}

int main()
{
  rec(data, 7, chk);
  return 0;
}

あんまり綺麗じゃないなあ。
っていうか、なんで関数ポインタなんて使ってるんだ、俺。

is2004の掲示板、'1'から'7'までの数字を一回だけ使って作れる、7文字の文字列のすべての組み合わせを出力するプログラムを、「できるだけ短く」書け。も参考になるかも。