chyanog 发表于 2010-9-26 20:42:13

本帖最后由 chyanog 于 2010-9-26 23:47 编辑

Mathematica code:
f := Module[{tmp},
   tmp = Select[
   Range, ! MemberQ, 0] &];
   Select[tmp,
    And @@ (Table[#[] == #[] + #[], {i, n - 2}] &[
      IntegerDigits[#]]) &]];
f /@ Range // Timing
需要说明的是,这段代码本来不够精简,在PKU大宝同学的帮助下改写成这样,当然这种方法很暴力,效率较低。
偶还发现
3-6位这种数的个数也比较有趣,都是完全平方数:
{36, 16, 4, 1}

〇〇 发表于 2010-9-27 19:18:07

题目出错,应该是百位,不是千位

mjs1wh 发表于 2010-9-27 21:14:00

用vbs就行
For j=2 TO 9
For i=1 TO j-1
b=100*j+i*10+j-i
c=i+j
d=c+j
e=d+c
f=e+d
a=a&chr(32)&b
if c<10 then a=a&chr(32)&c*1000+b
if d<10 then a=a&chr(32)&d*10000+c*1000+b
if e<10 then a=a&chr(32)&e*100000+d*10000+c*1000+b
if f<10 then a=a&chr(32)&f*1000000+e*100000+d*10000+c*1000+b
Next
Next
MsgBox a

chyanog 发表于 2010-10-9 20:45:49

"十一"在家十天,在家干农活挺累的,今天刚到校,家里没网.发现9楼的Java代码有误(尽管是小错)。用C又重写了,第一个还是“构造型”的,另一个是“暴搜型”的:
#include <stdio.h>
int main()
{
    int count=0;
    for (int i=1;i<9;i++)
    {
      for (int j=1;j<9;j++)
      {
            int a,a1=i,a2=j,t=10*a2+a1;
            while (a1+a2<10)
            {
                a=a1+a2;
                a1=a2;
                a2=a;

                int k=1;
                for (int u=t;u;u/=10)
                {
                  k*=10;
                }
                t+=k*a;
                printf("%d",t);
                printf(++count%10? "\t":"\n");
            }
      }
    }
    printf("\n\ncount : %d\n",count);
    return 0;
}
---------------------------------------------------------------
#include <stdio.h>
#include <math.h>
#define MAXDIG 6
int main(int argc, char *argv[])
{
        int count=0;
    for (int dig=3;dig<=MAXDIG;dig++)
    {
      for (int n=(int)pow(10.0,dig-1);n<(int)pow(10.0,dig);n++)
      {
            int a,i=0,m;
            for (int t=n;t!=0;t/=10)
            {
                m=t%10;
                if (m==0) break; //continue;
                a=m;
            }

            bool flag=true;
            for ( i=0;i<=dig-3;i++)
            {
                if (a!=a+a)
                {
                  flag=false;
                  break;
                }
            }
            if (flag)
                        {
                    printf("%d",n);
                   printf(++count%10?"\t":"\n");
            }       
      }
    }
    printf("\nCount : %d\n",count);
    return 0;
}

leeweb 发表于 2010-10-25 07:18:01

57个,穷举法

leeweb 发表于 2010-10-26 16:33:19

穷举法
页: 1 [2]
查看完整版本: 上班路上想到的有意思的问题