大佬们求解题目
vb吧
全部回复
仅看楼主
level 1
Wfvcdd 楼主
Public Function pliang(x As Long) As Boolean
Dim a As Long, y As Long
Dim flag As Boolean
pliang = True
y = x
If y < 4 Then
pliang = False
Else
Do While y > 1
For a = 2 To y
If (y Mod (a * a) <> 0) And (a * a > y) Then
pliang = true '①处改错 2分
Exit Do
ElseIf (y Mod (a) = 0) Then '②处改错 2分
Do
y = y \ a
Loop Until (y Mod a <> 0)
If a > y Then Exit Do '③处改错 2分
End If
Next a
Loop
End If
End Function
Private Sub Cmd1_Click()
Dim i As Long
For i = 100 To 600
If pliang(i) = True Then
k = k + 1
Print i;
If k Mod 6 = 0 Then Print
End If
Next i
End Sub
这三处改错真的难倒我了,就是不会做这种题目,跪求大佬解答[惊哭]
2023年06月21日 11点06分 1
level 15
这题出的水平不行啊,代码太复杂了……其实可以写的更简单的
先来看看这代码的思路吧
首先,如果y<4,则该数不是漂亮数,返回False(但其实没必要,下面的流程也能判断出这个结果来)
然后,令a从2开始,依次判断y是否为a的平方的倍数,如果是(第2处改为 ElseIf y Mod a * a = 0 Then,注意不需要加括号,虽然加上也没错),则把因子a从y中除干净,除完之后……说实话这里到底打算满足个什么条件就可以提前退出循环,我也搞不懂,y=1?但是外层的循环条件就是y>1啊,何必呢……总之第3处我能想到的唯一合理改法就是改成 If y = 1 Then Exit Do 了
那么循环到什么时候为止呢?要么到y=1,那么原数x就是漂亮数;要么到a*a>y(注意 If (y Mod (a * a) <> 0) And (a * a > y) Then 这句,前面那个条件就是多余的,真正有用的就是后面的a*a>y),也就是y没除干净,没到1,还剩下了不为平方数的部分,那么原数就不是漂亮数,令 pliang = False (第1处),并退出循环
顺便,写个简单的代码给你看看吧:
Private Function pliang(x As Long) As Boolean
Dim a As Long, y As Long
y = x
a = 2
Do Until a * a > y
If y Mod a * a = 0 Then
Do While y Mod a = 0
y = y \ a
Loop
End If
a = a + 1
Loop
pliang = y = 1
End Function
2023年06月21日 14点06分 2
补充一些内容:为什么外层循环的条件的当y>1时循环,而内层还有一个If y=1 Then Exit Do呢?实际上,真正多余的不是内层的Exit Do,而是外层这个循环,它根本就是不必要的,整个外层循环体只会执行一次
2023年06月22日 07点06分
@- 其实就是分解质因数,只是要求每个质因数都必须出现至少两次,比如100=2*2*5*5,72=2*2*2*3*3都是漂亮数,而24=2*2*2*3就不是(因为3只出现了一个);当然换个思路也可以,比如如果x是a的倍数,但不是a*a的倍数,则x肯定不是漂亮数
2023年06月22日 10点06分
@- 是的,如果用“分解质因数”这个思路,就不要求a是质数,因为把质数除干净之后,合数因子也就没有了
2023年06月23日 03点06分
@- 不过我这里换的思路还要求a必须是质数,如果像a=4这种情况,x是4的倍数而不是16的倍数,仍然不能说明x不是漂亮数
2023年06月22日 11点06分
1