无心人 发表于 2009-1-31 22:37:11

:b:

我那个算法还是做了点优化的
就是在判定是否平方数上

你用开方算是不对的

另外,穷举平方数用累加
计算数字和用Cache法

kofeffect 发表于 2009-2-1 00:44:51

原帖由 无心人 于 2009-1-31 22:37 发表 http://bbs.emath.ac.cn/images/common/back.gif
:b:

我那个算法还是做了点优化的
就是在判定是否平方数上

你用开方算是不对的

另外,穷举平方数用累加
计算数字和用Cache法
:b:

开方算为什么不对啊:Q:

穷举平方数用累加
计算数字和用Cache法

请教这两招怎么用:)

无心人 发表于 2009-2-1 08:46:46

因为,数字和的范围是很小的
比如24*9内的数字就能表示24位以内整数的数字和
只要预先把这个数字范围的数中的数字标上是否平方数就可以了

累加的算法看平方数数字和问题的GxQ的分析
具体是$(N + 1)^2 = N^2 + 2N + 1$

Cache法是预先计算4位数(0-9999)的数字和
然后,你用10000进制表示你的数字就可以节约分解数字的计算了

当然1000000进制也可以, 不过预先计算的工作量多些

kofeffect 发表于 2009-2-1 18:38:04

再修改下:Clear;
k = 1;
a = 0;
len = 0;
squareLst = Table;(*初始化和为平方数的列表*)
For[i = 1, i < 10^5 + 1, i++,
    a += i + i - 1;(*使用累加(n + 1)^2 = n^2 + n + n + 1计算平方数*)
    (*二重平方数*)
    len = Length];
    lst = IntegerDigits;
    s = 0;
    (*计算数字和*)
    For[j = 1, j < len + 1, j++,
      s += Part;
      ];
    If,(*PutAppend;*)
      (*Print["NO.", k, "(", a, " ", s, ")"];*)k += 1, Continue[];];
    ] // Timing
Print["No.", k]

无心人 发表于 2009-2-1 21:09:56

:)

恐怕你要承担查询的代价
怎么不直接用数组保存是否平方的信息?

kofeffect 发表于 2009-2-2 22:10:19

无心人
怎么快速得到整数1~10000的各位数和?有没有直接的生成公式?

无心人 发表于 2009-2-2 22:11:44

:)

s = i + j + k + l

kofeffect 发表于 2009-2-2 22:19:23

:b:
原来是这样:)

无心人 发表于 2009-2-2 22:26:10

不是我想出来的

要归功于几个大哥哥大姐姐

kofeffect 发表于 2009-2-2 22:37:58

呵呵,知道是很有规律的,可是就是理不清:)
果然简洁,天气大好:)
页: 1 [2] 3
查看完整版本: 平方数问题一则