网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月01日漏签0天
lua吧 关注:11,644贴子:22,023
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 7回复贴,共1页
<<返回lua吧
>0< 加载中...

【编程解决智力题之三】大数计算——Lua的短板

  • 只看楼主
  • 收藏

  • 回复
  • 沙城雨人
  • 赫赫有名
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
【题目】:有一个数字,把这个数字最后一位挪到第一位,新的数字是原来数字的两倍,找出一个这样的数。
【分析】:假设这个数是一个N+1位数(N>=1),前N位为a,最后一位为b,则此数可记为10a+b。
根据题意:
2*(10*a + b) = b*10^N + a
==> 19*a = b*(10^N - 2)
我们需要找到一个10^N - 2的数,它能被19整除,或者说找一个10^N,它整除19的余数为2。
lua求余数的函数为:math.mod,看起来直接写个简单的程序就能算出结果:
local n = 0
local k = 1
while true do
n = n + 1
k = k*10
if math(k,19) == 2 then
break
end
end
print(n,k-2/19)
-----------------------------------
结果:
171e+017
这里算出了n=17,也就是说这个数是一个18位数(n+1位数),但是我们试图输出a值,却发现是个科学计算法的精确度很低的数。
大数计算是lua的短板,因为lua中没有整数的概念,所有的数都是双精度型,在这个数比较大的时候,一律采用科学计数法,得到的结果不是精确值。所以我们在编程的时候,一定要设法避免大数计算。
如果只求n值,有个数论的技巧:从1开始,一路乘10取mod 19,直到结果等于2为止,取模运算将结果限制在0-18之间,就不会因为精度影响算法结果。程序如下:
local n = 0
local k = 1
while true do
n = n + 1
k = math.mod(k*10,19)
if k == 2 then
break
end
end
print(n)
-----------------------------------
结果:
17
同样的问题,如果用c,c++或者python,都可以算出精确结果。
附python程序(python必须缩排,自己处理一下):
n=1
k=10
while True:
n=n+1
k=k*10
if k%19==2:
a=(k-2)/19
break
print(n,a)
-----------------------------------
结果:
17 52631578947368421
这个题目是多解,事实上,当b=1时的第一个解 05263157894736842实际只有17位,是不合格的,当b=2-9时算出来的都是合法解:
105263157894736842
157894736842105263
210526315789473684
263157 894736 842105
315789 473684 210526


  • 沙城雨人
  • 赫赫有名
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
漏了2个:
421052631578947368
473684210526315789
事实上,这一串数字和1/19的循环节有密切关系。这里面涉及的数论知识有兴趣的朋友自己研究。


2026-03-01 06:36:37
广告
不感兴趣
开通SVIP免广告
  • 沙城雨人
  • 赫赫有名
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
还漏了个315789473684210526,贴吧不能修改只有打补丁了。


  • IveArthur
  • 远近闻名
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
大数计算其实并不考虑lua
因为没有integer
但是既然会要求大数计算
也就一般要求高效率了
一般就用C++的数组去模拟了
   --新鲜萝莉交流与深入:3.1.4.1.8.6.0.8.2


  • czfshine
  • 富有名气
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
。。。。 挖下坟,
用lua table 模拟大数可求精确的数值。


  • 被遗忘的十年1
  • 默默无闻
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
执子之手,与子偕老。愿得一人心,白首不分离


  • necrohan
  • 崭露头角
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
挖下坟。
楼主的lua程序有问题,print(n,k-2/19)应该是print(n,(k-2)/19),不是lua的问题。
楼主说的问题不存在。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 7回复贴,共1页
<<返回lua吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示