找回密码
 欢迎注册
楼主: 无心人

[原创] 上班路上想到的有意思的问题

[复制链接]
发表于 2010-9-26 20:42:13 | 显示全部楼层
本帖最后由 chyanog 于 2010-9-26 23:47 编辑

Mathematica code:

  1. f[n_] := Module[{tmp},
  2.    tmp = Select[
  3.      Range[10^(n - 1), 10^n - 1], ! MemberQ[IntegerDigits[#], 0] &];
  4.    Select[tmp,
  5.     And @@ (Table[#[[i]] == #[[i + 1]] + #[[i + 2]], {i, n - 2}] &[
  6.         IntegerDigits[#]]) &]];
  7. f /@ Range[3, 6] // Timing
复制代码
需要说明的是,这段代码本来不够精简,在PKU大宝同学的帮助下改写成这样,当然这种方法很暴力,效率较低。
偶还发现
3-6位这种数的个数也比较有趣,都是完全平方数:
{36, 16, 4, 1}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-9-27 19:18:07 | 显示全部楼层
题目出错,应该是百位,不是千位
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-10-9 20:45:49 | 显示全部楼层
"十一"在家十天,在家干农活挺累的,今天刚到校,家里没网.发现9楼的Java代码有误(尽管是小错)。用C又重写了,第一个还是“构造型”的,另一个是“暴搜型”的:

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int count=0;
  5.     for (int i=1;i<9;i++)
  6.     {
  7.         for (int j=1;j<9;j++)
  8.         {
  9.             int a,a1=i,a2=j,t=10*a2+a1;
  10.             while (a1+a2<10)
  11.             {
  12.                 a=a1+a2;
  13.                 a1=a2;
  14.                 a2=a;

  15.                 int k=1;
  16.                 for (int u=t;u;u/=10)
  17.                 {
  18.                     k*=10;
  19.                 }
  20.                 t+=k*a;
  21.                 printf("%d",t);
  22.                 printf(++count%10? "\t":"\n");
  23.             }
  24.         }
  25.     }
  26.     printf("\n\ncount : %d\n",count);
  27.     return 0;
  28. }
复制代码
---------------------------------------------------------------

  1. #include <stdio.h>
  2. #include <math.h>
  3. #define MAXDIG 6
  4. int main(int argc, char *argv[])
  5. {
  6.         int count=0;
  7.     for (int dig=3;dig<=MAXDIG;dig++)
  8.     {
  9.         for (int n=(int)pow(10.0,dig-1);n<(int)pow(10.0,dig);n++)
  10.         {
  11.             int a[10],i=0,m;
  12.             for (int t=n;t!=0;t/=10)
  13.             {
  14.                 m=t%10;
  15.                 if (m==0) break; //continue;
  16.                 a[i++]=m;
  17.             }

  18.             bool flag=true;
  19.             for ( i=0;i<=dig-3;i++)
  20.             {
  21.                 if (a[i+2]!=a[i+1]+a[i])
  22.                 {
  23.                     flag=false;
  24.                     break;
  25.                 }
  26.             }
  27.             if (flag)
  28.                         {
  29.                     printf("%d",n);
  30.                      printf(++count%10?"\t":"\n");
  31.             }       
  32.         }
  33.     }
  34.     printf("\nCount : %d\n",count);
  35.     return 0;
  36. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-10-25 07:18:01 | 显示全部楼层
57个,穷举法
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-10-26 16:33:19 | 显示全部楼层
穷举法
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-8 10:43 , Processed in 0.041609 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表