正整数n若是它平方数的尾部,则称n为同构数.例如,6是其平方数36的尾部,76是其平方数5776的尾部,6与76

正整数n若是它平方数的尾部,则称n为同构数.例如,6是其平方数36的尾部,76是其平方数5776的尾部,6与76

vb编程……
要按流程图走……
yzbjb 1年前 已收到1个回答 举报

目成 春芽

共回答了18个问题采纳率:100% 举报

十进制平方自守数(自同构数)定义:
如果某个数的平方的末尾极为数等于这个数,那么就称这个数为自守数.
性质一:
n位的自守数,从首位开始去除任意位,得到的仍是自守数.
性质二:
N位的自首数只有两个,一个是5的M(M=2N?)次方的末N位,即5^m mod 10^N
另一个是10^N+1减去刚才那个数,即-5^m+1 mod 10^N
在下面介绍的来自百度用户l4m2space的方法中,罗列出了500位的尾数为5的自守数.
最完美的方法之一:(来自百度用户l4m2space)
Const Dig = 1000
Function ChengFa(ByVal M As String,ByVal N As String) As String
'用于大数相乘
Dim A&(),B&(),S&()
ReDim A(Len(M)),B(Len(N)),S(Len(M) + Len(N) + 1)
M = StrReverse(M)
For I = 1 To Len(M)
A(I) = Val(Mid(M,I,1))
Next
N = StrReverse(N)
For I = 1 To Len(N)
B(I) = Val(Mid(N,I,1))
Next
For I = 1 To Len(M)
For J = 1 To Len(N)
S(I + J) = S(I + J) + A(I) * B(J)
Next
Next
For I = 2 To Len(M) + Len(N) + 1
If S(I) > 9 Then
S(I + 1) = S(I + 1) + S(I) 10
S(I) = S(I) Mod 10
End If
Next
Do Until I 0 And k Mod 10 = j Mod 10
k = k 10
j = j 10
Loop
If k = 0 Then Print i
Next i
End Sub
方法三:来自百度用户bz3zwy
注:也就是已知n为自守数,只要确定其前面再加的一个数字即可.于是可得如下算法:
Option Explicit
Const Max& = 8
Dim a#(Max),c#(Max)
Dim i&,total&,S#
Private Sub Command1_Click()
a(0) = 1
For i = 1 To Max
a(i) = a(i - 1) * 10
Next
c(0) = 0
total = 0
work (1)
End Sub
Sub work(i&)
Dim j&
If i = Max Then Exit Sub
For j = 0 To 9
c(i) = a(i - 1) * j + c(i - 1)
S = c(i) * c(i)
If S - Int(S / a(i)) * a(i) = c(i) Then
If j > 0 Then
total = total + 1
Print total; c(i); S
End If
work (i + 1)
End If
Next
End Sub
方法四:来自百度用户bz3zwy,博主称,由 仙剑魔 (福尔魔剑(HolMoJan)) 提供
[原理分析]:
假设a为n位十进制数
若a为自守数,则a*a mod 10^n=a
令p=10^n,k=a*ap
则a*a=k*p+a
即a*(a-1)=k*p=k*10^n
于是得出判定依据
如果a*(a-1)内2,5的因子数均>=n,则a为自守数
a和a-1,一个奇数一个偶数
所以2是完全由偶数提供的
即偶数必定是2^n*t的形式
刚才说了a和a-1是一奇数一偶数
2的因子全在偶数里
那么若偶数里同时有5的因子,可能吗?
假设一个数字(0除外)末尾有m个0,那么他平方后末尾就会有2m个0
所以可以得出结论:偶数里没有因子5
即因子5全部在奇数里
则奇数必定是5^n*r的形式
[编程者感言]
其实数学相关的题目
如果能推导出有用的信息以及结论
就能得到一些简单快速的算法
一开始只是试着算下的
直到推出这个a*(a-1)=k*p=k*10^n式子的时候我觉得可能会有用
后来讨论出了2,5因子的情况,算法就基本成型了
其实这里用基2也能算,只要交换下i,j的累乘值
但是可以发现基5的速度快得多,省去了不少计算
[基5的测试代码]
Dim n As Long,t As Long,i As Long,j As Long,a As Long
i = 1
j = 1
Print 0
For n = 1 To 7
i = i * 5
j = j * 2
For t = (10 ^ (n - 1) - 1) i + 1 To (10 ^ n - 1) i
a = i * t
If (a + 1) Mod j = 0 Then
Print a + 1
End If
If (a - 1) Mod j = 0 Then
Print a
End If
NextNext

1年前

8
可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 16 q. 0.018 s. - webmaster@yulucn.com