设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 怪蜀黍
打印 上一主题 下一主题

[版务] 【公告】关于《P叔的RM考场第十弹》的成绩公布

[复制链接]

Lv1.梦旅人

梦石
0
星屑
65
在线时间
84 小时
注册时间
2008-3-31
帖子
88
1
发表于 2013-8-2 22:20:18 | 显示全部楼层
本帖最后由 490832999 于 2013-8-2 23:07 编辑

@protosssonny
@认真的学
这样应该可以了...100万个rand(1073740000)相加...我的机器用时...1分24秒
不知道有什么更好的方法可以减少运算次数...
    arr = [] # 所有加数
    place = [] # 存放每个数的每一位数,如place[0]存放所有个位数,place[1]存放所有十位数
    str = "" # 用于显示式子
   
    m = 1000000
    max_num = 1073740000
   
    for num_index in 0...m
      arr.push(rand(max_num))
      n = arr[num_index].to_s.size # 此为n位数
      # 最后显示的式子
      if str.size < 1000
        str += "#{arr[num_index]} #{num_index == m - 1 ? "=" : "+"} "
      else
        str += "... = " if num_index == m - 1
      end
      for j in 0...n
        # 将每一位数放入对应place
        # 即个位放进place[0],十位place[1],以此类推
        place.push([]) until place.size >= n
        place[n-1-j].push(arr[num_index].to_s[j,1])
      end
    end
   
    place_index = 0
    # 从place[0](个位数)开始相加
    # 直到加完最后一个place(最高位数)
    until place_index == place.size
      tmp_num = 0
      for pos in 0...place[place_index].size
        # 每个place对就每一位(类似竖式中同一列)
        # 123 + 5789 +624 +34 + 6 与成竖式
        #
        # place.......[3][2][1][0]
        #................[0][1][2][3
        #................[5][7][8][9
        #................[0][6][2][4
        #................[0][0][3][4
        #+.1.?        [0][0][0][6
        #----------------------------
        # 将每个place的数相加(即最多m个1位数相加),得到tmp_num
        tmp_num += place[place_index][pos].to_i
      end
      
      n = tmp_num.to_s.size     # tmp_num 是 n 位数
      # tmp_num 的最后一位(个位数)就是结果中的 第i位
      # 直接将此值赋入place[place_index]
      place[place_index] = tmp_num % 10
      for tmp_num_pos in 0...n - 1
        # 个位以上的全部进位(同竖式算法)
        place.push([]) until place.size >= n + place_index
        place[place_index+n-1-tmp_num_pos].push(tmp_num.to_s[tmp_num_pos,1])
      end
      place_index += 1
    end
   
    ans = "" # 用于显示得数
    for i in 0...place.size
      if place[place.size-1-i].class != "Array"
        ans += place[place.size-1-i].to_s
      end
    end
   
    print str,ans

点评

是的,其实可以n位压成1位,可以加快运算速度。(一般4位或8位压1位)  发表于 2013-8-3 09:31
因为假若有几百亿个数....就有几百亿的个位,存放起来再相加...得出的和也太大了...  发表于 2013-8-3 02:28
其实...存放是多余了(刚开始思路按竖式走,所以存放起来)...直接加上去得出结果并判断进位....  发表于 2013-8-3 02:27

评分

参与人数 1星屑 +5 收起 理由
救世小树 + 5 卧槽100万次~我也试试

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
84 小时
注册时间
2008-3-31
帖子
88
2
发表于 2013-8-2 22:51:26 | 显示全部楼层
490832999 发表于 2013-8-2 22:20
P叔...这样应该可以了...100万个rand(1073740000)相加...我的机器用时...1分24秒
不知道有什么更好的方法可 ...

刚修改了一下...因为中括号里面i就变成斜体了....
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-17 22:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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