找回密码
 加入
搜索
查看: 17064|回复: 42

[效率算法] [已解决]求从1加到999999999的高效算法

 火... [复制链接]
发表于 2010-8-3 12:19:30 | 显示全部楼层 |阅读模式
本帖最后由 psp7456 于 2010-8-4 00:25 编辑

从1开始一直加到999999999其中包含4或7的数字排除开不要运算。
例如:4 7 14 104 207 5468 97854 456789等等只要包含了4或7的数字就排除掉
1+2+3+5+6+8+9+10+11+12+13+15+16+18+19.......999999999=?


我的算法如下:
local $i,$j
for $i=1 to 999999999
        if stringregexp($i,"4|7") then
                
        else
                $j=$j+$i
        endif
next
MsgBox(4096, "答案", $j)
结果算了半个多小时也没结果,不知道大家有没有什么更高效的算法,请赐教。

用dephi重写了边代码,计算了7分多钟终于精确解出来了:63380593714397184
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  lIndex:LongInt;
  dResult:int64;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
     for lIndex:=1 to 999999999 do
     if (Pos('7',IntToStr(lIndex))=0) and (Pos('4',IntToStr(lIndex))=0) then
     dResult:=dResult+lIndex;

     Writeln(dResult);
     Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
C.L.兄的解法很巧,但可惜存在一个精度问题,总之谢谢大家了。学到很多东西才是真。

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-8-3 12:27:40 | 显示全部楼层
关注下
累加的话,必然会很慢吧?
看看达人们的其他算法
发表于 2010-8-3 12:36:13 | 显示全部楼层
本帖最后由 tryhi 于 2010-8-3 13:40 编辑
MsgBox(0,"从1加到9999999999999999999",(1+9999999999999999999)*9999999999999999999/2)
谁说我不是最高效的我毙了谁

-------------不好意思,没看清楚标题。。。。。。。。。。
发表于 2010-8-3 12:36:58 | 显示全部楼层
本帖最后由 3mile 于 2010-8-3 12:38 编辑
$number=InputBox("","请输入要累加的数",999999999)
If Mod($number,2)=0 Then 
        $fin=($number+1)*($number/2)
Else
        $fin=($number+1+1)*(($number+1)/2)-($number+1)
EndIf
MsgBox(0,0,$fin)
发表于 2010-8-3 12:39:41 | 显示全部楼层
还要排除包含4或者7的数呢.....
发表于 2010-8-3 12:51:36 | 显示全部楼层
这算来有用么?
发表于 2010-8-3 12:55:13 | 显示全部楼层
谁说我不是最高效的我毙了谁
tryhi 发表于 2010-8-3 12:36



(上底+下底)*高/2
 楼主| 发表于 2010-8-3 13:00:31 | 显示全部楼层
回复 3# tryhi


貌似溢出了,-4.11.....e+018
 楼主| 发表于 2010-8-3 13:06:38 | 显示全部楼层
受大家启发,先算出1+999999999,然后减去从1到999999999排除带4和7的数之和。
不过,还是漫长的计算过程啊....
local $i,$j
for $i=1 to 999999999
        if stringregexp($i,"4|7") then
                $j=$j+$i
        endif
next
MsgBox(4096, "答案", (1+999999999)*(1+999999999)/2-$j)
发表于 2010-8-3 14:05:43 | 显示全部楼层
本帖最后由 wanhua8u8 于 2010-8-3 14:07 编辑

答案出来了吗? 貌似你的不行吧
local $i,$j

for $i=1 to 999999999

        if stringregexp($i,"4|7") then

                $j=$j+$i

        endif

next

MsgBox(4096, "答案", (1+999999999)*999999999/2-$j)
发表于 2010-8-3 14:32:20 | 显示全部楼层
本帖最后由 3mile 于 2010-8-3 14:33 编辑
$number=InputBox("","请输入要累加的数")
Local $seven,$four,$n=1
For $i=4 To $number Step 10
        $seven=$i+3
        $four+=$i+$seven
Next
$fin=($number+1)*$number/2-$four
MsgBox(0,0,$fin)
经计算得出
1-9结果为34
1-99=3940
1-999=399400
1-9999=39994000
应该有个规律为:1-n(当且仅当n为9系列时)可知规律为:
$number=InputBox("","请输入要累加的数")

If StringRegExp($number,'\b9{1,}\b',0) Then
        $nine=StringMid($number,1,StringLen($number)-1)
        $zero=StringReplace($nine,"9","0")
        $fin=3&$nine&4&$zero
        MsgBox(0,0,$fin)
EndIf

评分

参与人数 1威望 +2 金钱 +40 收起 理由
afan + 2 + 40 学习了

查看全部评分

发表于 2010-8-3 14:36:42 | 显示全部楼层
不考虑数据溢出.因为目前大数计算需要专用的库来实现.(如开源的GMP)
Global $s,$t,$r
$s=1
$t=9999999
$r=($s+$t)*$t/2
For $i = 1 To StringLen($t)
        $j='1'
        While StringLen($j)<>$i
                $j&='0'       
        WEnd
        $r=$r-(((4*$j)+(5*$j-1))*$j/2)
        $r=$r-(((7*$j)+(8*$j-1))*$j/2)
Next
MsgBox(32,"",$r)

评分

参与人数 1威望 +2 金钱 +50 收起 理由
afan + 2 + 50 厉害

查看全部评分

发表于 2010-8-3 14:40:26 | 显示全部楼层
回复 11# 3mile


    高手哇,崇拜中...
发表于 2010-8-3 14:51:30 | 显示全部楼层
回复 13# thesnow
您才是高手。
一直仰慕中。。。。。
发表于 2010-8-3 15:11:02 | 显示全部楼层
回复  thesnow
您才是高手。
一直仰慕中。。。。。
3mile 发表于 2010-8-3 14:51



    大哥,我们算法都错了....
验证:
1+2+3+5+6+8+9+10+11+12+13+15+16+18+19+20+21+22+23+25+26+28+29+30+31+32+33+35+36+38+39+50+51+52+53+55+56+58+59+60+61+62+63+65+66+68+69+80+81+82+83+85+86+88+89+90+91+92+93+95+96+98+99= 2992
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-12 22:59 , Processed in 0.095385 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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