chyanog 发表于 2011-3-15 23:55:20

本帖最后由 chyanog 于 2011-3-16 01:22 编辑

来个Mathematica的吧,
就是速度相对C类语言慢很多(大约20s),wayne有空的话可以帮忙看看可否改进
FromDigits /@ {#[], #[], #[]} & /@
Select[Permutations[
    Range], #[] == 1 && #[] <= #[] &&
   FromDigits[#[]] + FromDigits[#[]] ==
      FromDigits[#[]] &] // Timing

chyanog 发表于 2011-3-15 23:58:37

这样更快些:
Module[{t1, t2},
t1 = Cases], {a_, b_, c_, d_, e_, f_, g_, h_, i_, j_} /; g == 1 && a <= d];
t2 = Cases[ t1, {a_, b_, c_, d_, e_, f_, g_, h_, i_,j_} /; #[{a, b, c}] + #[{d, e, f}] == #[{g, h, i, j}] &[
FromDigits]];
Row /@ {#[], #[], #[]} & /@ t2
] // Timing

chyanog 发表于 2011-3-16 01:05:22

本帖最后由 chyanog 于 2011-3-16 01:06 编辑


#include <stdio.h>
int check ( int i, int j, int k )
{
    int a = {0}, ii;
    for ( ; i > 0; i /= 10 )
      a++;
    for ( ; j > 0; j /= 10 )
      a++;
    for ( ; k > 0; k /= 10 )
      a++;
    for ( ii = 1; ii < 10; ii++ )
      if ( a != 1 ) return 0;
    return 1;
}

int main()
{
    int i, j, k, cnt = 0;
    for (i = 100; i < 1000 ; i++ )
    {
      for (j = i; j < 1000 ; j++ )
      {
            k = i + j;
            if ( k > 1000 && k < 2000 && check ( i, j, k ) )
                printf ( "[%d]: \t%d + %d = %d \n", ++cnt, i, j, i + j );
      }
    }
    return 0;
}

wayne 发表于 2011-3-16 22:19:25

本帖最后由 wayne 于 2011-3-16 22:22 编辑

13# chyanog
参考4楼的分析,下面的程序直接在0.01秒内搞定:

data = Table, Sort@IntegerDigits[#.{100, 10, 1, 100, 10, 1}] == Complement, ii] &], {ii,Select, {6}], Divisible, 9] &]}];

Clear; Cases, {a_, b_, c_, d_, e_, f_} -> {100 a + 10 b + c, 100 d + 10 e + f,100 a + 10 b + c + 100 d + 10 e + f}]

wayne 发表于 2011-3-16 22:23:56

太棒了,终于又有一个2222了
页: 1 [2]
查看完整版本: abc+def=ghij