永发信息网

一道信息学竞赛试题

答案:1  悬赏:10  手机版
解决时间 2021-02-09 10:42
  • 提问者网友:爱唱彩虹
  • 2021-02-08 20:54
一道信息学竞赛试题
最佳答案
  • 五星知识达人网友:污到你湿
  • 2021-02-08 21:42
一般认为,某数的的N次方的后K位,与该数的后K位有关,K位之前不影响
就是12、122、的N次方的最后1位数,只与12中的2、122中的2有关
因此对整数N,求其最后K位的循环时,只要考虑N的后K位。
又认为,当尾数中第二次出现某值,则必从该值后即开始循环

以下代码用VBS实现,在WINDOWS系统中把代码复制进空文本文件,保存改后缀名为VBS,可以双击运行
'=========代码开始=========
'撇号开头的行是注释
'仅用于实现.限于VBS的性能,在验证很大的K时耗时极多

'n,k的输入值,没有做输入,可以手工修改
'j是寻找循环尾数的旗标
'ws是存储尾数的以逗号分隔的字符串、并可分解为尾数数组
'ts是存储某次幂尾数的字符串
n = 2
k = 1
j = 1
ws = ""
ts = ""

'制造一个长度为K的字符串,全部由0构成,用于补齐
for i = 1 to k
w = w & "0"
next

'初始化时,也就是幂次为1时
n = cutw (n)
ws= addw (n)

'm专门用于乘方计算
m = n

do until j = 0
ts = ""
m = cutw (m*n)
ts = addw (m)

'判断尾数ts是否已在ws中存在
if Instr (ws,ts) then
ws = ws & "," & ts
'存在,设置j值以退出循环
j = 0
else
ws = ws & "," & ts
j = j + 1
end if
loop

'将所有尾数字符串分解为数组
ws = split (ws,",")
for i = 0 to Ubound (ws)
'查找循环开始的尾数,重复出现的尾数正位于数组最后
if ws (i) = ts then
'我的输出方式
MsgBox "尾数有循环,从第" & i+1 & "次方开始,最早于第" & Ubound (ws) +1 & "次方出现重复," & "最小循环长度为" & Ubound (ws) - i
Wscript.Quit
end if
next

'函数cutw用于截断获得K位尾数
function cutw (p)
if Len (p) > k then
cutw = right (p,k)
else
cutw = p
end if
end function

'函数addw用于补齐K位尾数
function addw (q)
if Len (q) < k then
addw = Right (w & q,k)
else
addw = cutw (q)
end if
end function

'=========代码结束=========
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯