- 积分
- 14
- 注册时间
- 2009-5-7
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2010-3-15 07:08:53
|
显示全部楼层
来自 北京
本帖最后由 ggggwhw 于 2010-3-15 12:43 编辑
jimogsh 的代码虽短,但是效率还不如我在2楼的For循环效率呢,而且还大量占用内存.
既然FreddyMusic 是要考验效率的,那么我想我下面的代码效率应该是最高的了,几乎不占内存.
- In[1]:=
- zishu = 3725742742586314258657243585712425381245752124385742165;
- For[j = 1; k = 0, True, j++, h = k; k = h + j*9*10^(j - 1);
- If[zishu <= k, jieguo = (zishu - h)/j + 10^(j - 1) - 1; Break[]];];
- If[IntegerQ@jieguo, jieguo,
- "输入的字数" <> ToString[zishu] <> "有误,\n最接近的两种情况是:" <> "\n当字数:" <>
- ToString[1/10 (10 h + 10 j - 10^j j + 10 j*Floor@jieguo)] <>
- "时,\n页数是:" <> ToString[Floor@jieguo] <> ".\n当字数:" <>
- ToString[1/10 (10 h + 10 j - 10^j j + 10 j*Ceiling@jieguo)] <>
- "时,\n页数是:" <> ToString[Ceiling@jieguo] <> "."]
- Out[3]= 70506676484857082448459522581576160233148362933902891
复制代码 下面是用Module封存后的表达式,我想效率应该是相同的.
- In[4]:=
- zishu = 3725742742586314258657243585712425381245752124385742165;
- Remove@yeshu;
- yeshu[zishu_] := Module[{j, k, h, jieguo},
- For[j = 1; k = 0, True, j++,
- h = k; k = h + j*9*10^(j - 1);
- If[zishu <= k, jieguo = (zishu - h)/j + 10^(j - 1) - 1; Break[]];];
- If[IntegerQ@jieguo, jieguo,
- "输入的字数" <> ToString[zishu] <> "有误,\n最接近的两种情况是:" <> "\n当字数:" <>
- ToString[1/10 (10 h + 10 j - 10^j j + 10 j*Floor@jieguo)] <>
- "时,\n页数是:" <> ToString[Floor@jieguo] <> ".\n当字数:" <>
- ToString[1/10 (10 h + 10 j - 10^j j + 10 j*Ceiling@jieguo)] <>
- "时,\n页数是:" <> ToString[Ceiling@jieguo] <> "."]
- ];
- yeshu[zishu]
- Out[7]= 70506676484857082448459522581576160233148362933902891
复制代码 如果2楼的是O(n)那么4楼的就是O(10^n)了 |
|