赞 | 0 |
VIP | 10 |
好人卡 | 5 |
积分 | 1 |
经验 | 5623 |
最后登录 | 2020-11-14 |
在线时间 | 84 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 65
- 在线时间
- 84 小时
- 注册时间
- 2008-3-31
- 帖子
- 88
|
本帖最后由 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
|
评分
-
查看全部评分
|