本文讲解力扣算法(LeetCode)第9题(回文数操作),用VB语言的解法教程。通过本文的练习,老铁们可以更加深入的掌握VB递归循环的思路,熟悉并掌握While循环的用法。

我们先看一下题目:

题目描述

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
解释:从左向右读, 为 -121 。从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
解释:从右向左读, 为 01 。因此它不是一个回文数。
学完本课用VB语言做出来的效果

力扣官方给的这道题的题解非常精妙、逻辑也很完备,但是理解起来还是有一定的困难(起码我是这样),于是我给了一套自己的简单方法,主要思路是运用While Wend循环。

官方题解相对比较复杂,因为考虑了负数和尾号为0的情况,我给的答案简单一些,适合新手。按照惯例,本教程分为三大部分:

  1. 完整代码

  2. 原理演示

  3. 代码解释


1

完整代码

力扣算法第9题(回文数)简单方法的完整VB代码(基于Access数据库)如下,在实际应用时要学会调用。

Option Compare Database


'力扣算法第9题,官方解题过程比较缜密

'我这个方法比较简单一些,适合初学者


Function reverse(x As Double)


reverse = 0 '起始值为0


While (x > 0) '输入数字大于0时,继续循环

reverse = reverse * 10 + x Mod 10

'x Mod 10是取余函数,68 mod 10 = 8

'68除以10,60能除动,8除不动

'8 mod 10 = 8

x = x \ 10

'符号\代表除完之后取整,68 \ 10 = 6

'6 \ 10 = 0

Wend '继续循环,直到x \ 10值为0


End Function

我可以把官方题解的思路(我已经改装成VB语言,可以直接模块调用)给大家,大家对比一下各自的优劣。本节课讲简单版本的解题思路。

Option Compare Database


Function revertedNumberJudge(x As Long) As String


Dim revertedNumber As Long


If x < 0 Then

revertedNumberJudge = "该数不是回文数!"

Else

revertedNumber = 0

While x > revertedNumber

revertedNumber = revertedNumber * 10 _

+ x Mod 10

x = x \ 10

Wend

If x = Int(revertedNumber) Or _

x = Int(revertedNumber \ 10) Then

revertedNumberJudge = "该数是回文数!"


Else

revertedNumberJudge = "该数不是回文数!"

End If

End If


End Function

2

原理演示

力扣算法第9题(回文数)我给的解题思路,是通过While Wend循环,给定一个输入的数字x,不停的取这个数字的最后一位,把这位数字乘以10再加上下一次的最后一位,直到所有位数全部取完,数字就倒转过来了。

VB编程计算回文数的原理演示

本案例取x值为“12345”,reverse(数字倒转回来的值)初始值为0,这可以视为第0次循环。

第1次循环,

reverse值=reverse*10 + x Mod 10,由于reverse的初始值为0,12345 mod 10(mod取模函数,非常常用)的值为5,因此第1次循环后,reverse的值为5。

计算完reverse值之后,x也要进行去尾处理,x \ 10=12345 \ 10=1234

(注:在VB语言中,“\”表示整除,得到商但不含小数,比如3 \ 5 = 0)。

第2次循环,

reverse值=reverse*10 + x Mod 10,现在reverse的值为5,x的值为1234,那么reverse=5*10 + 1234 Mod 10 = 54。

由于x>0,计算reverse值之后,根据While Wend程序设置,要继续对x=1234进行去尾处理,x \ 10=123。

第3次循环,

reverse值=reverse*10 + x Mod 10=54*10 + 123 Mod 10 = 543。

继续对x=123进行去尾处理,x \ 10=12。

第4次循环,

reverse值=reverse*10 + x Mod 10=543*10 + 12 Mod 10 = 5432。

继续对x=12进行去尾处理,x \ 10=1。

第5次循环,

reverse值=reverse*10 + x Mod 10=5432*10 + 1 Mod 10 = 54321。

继续对x=1进行去尾处理,x \ 10=0。

注意,这时x已经=0,不满足While x>0的条件,因此循环结束。

3

代码解释

力扣算法第9题(回文数)的简单解法,语句比较精炼,思想也比较巧妙,核心是利用现有函数Mod取模、符号“\"整除去尾进行循环计算。

完整代码如下(去掉了代码注释)

Option Compare Database

Function reverse(x As Double)

reverse = 0

While (x > 0)

reverse = reverse * 10 + x Mod 10

x = x \ 10

Wend

End Function

本案例是在模块中进行编程,应用的时候进行临时调用。

Function reverse(x As Double)

reverse(x)就是一个函数y=f(x),x是自变量,reverse相当于因变量。输入x的值,Function就会做相应的计算,reverse就是计算的结果。

x是输入的数字,reverse是数字反转后的数字。

reverse = 0

While (x > 0)

reverse = reverse * 10 + x Mod 10

x = x \ 10

Wend

End Function

这段代码是循环代码,注意从reverse开始循环的,reverse=0是必须有的。

reverse计算在前,x计算在后,顺序不能搞错。

reverse和x都利用了递归的原理,不停的计算并且调用原来的自己(我没理解错吧,是递归?)直到循环条件While(x>0)不成立为止。

reverse*10就是把上一次得到的数字乘以10,再加上x Mod 10得到的尾数,完成了一次数字调转。这是第1次计算,然后89进行去尾操作,x=8。

比如89这个数,第1次循环reverse=0,直接加上89 Mod 10=9,因此第1次循环后reverse=9,x=8。

第2次循环,reverse要先加上第1次循环后的自己,reverse=9*10,再加上x Mod 10 = 8 Mod 10 = 8,reverse=90+8=98。

x这时候再进行去尾操作就等于0了,因为8\10=0。

因为x=0不符合While(x>0)的条件,循环到此戛然而止。

这段代码还是非常短小精悍的,体现了递归的思想和能力,充分利用了把复杂问题分解化、简单化的计算机编程思想。

Access数据库窗体中调用代码如下:

Option Compare Database


Private Sub Text1_AfterUpdate()

Text2 = reverse(Val(Nz(Text1)))

If Val(Text2) = Val(Text1) Then

Text3 = "是回文数"

Else

Text3 = "不是回文数"

End If

End Sub


Private Sub Text1_Change()

Me.Refresh

End Sub

这段调用代码就比较容易理解了,

Text2 = reverse(Val(Nz(Text1)))

直接调用reverse这个我们封装好的模块函数,就能直接计算数字倒转的结果,非常简洁。

If Val(Text2) = Val(Text1) Then

Text3 = "是回文数"

Else

Text3 = "不是回文数"

End If

这一段是判断是否是回文数的语句,如果输入文本框Text1=输出文本框Text2.那么就是回文数,如果不相等那就不是回文数。

这就是力扣算法第9题的简单版解题方法,当然有更复杂、更简洁、更严谨的方法,也就是官方给的方法,留待下回分解吧。

举报/反馈

宇哥玩Access

5.3万获赞 1.2万粉丝
编程技术和建站技术分享,电力系统在职员工
乘风计划作者
关注
0
0
收藏
分享