SQL陳述句實作水仙花數求取
"水仙花數 ",所謂 "水仙花數 "是指一個三位數,其各位數字立方和等于該數本身,例如:370是一個 "水仙花數 ",因為 370=3 的三次方+7的三次方+0 的三次方
實作方法
本文用兩種方法解決水仙花數的求取
方法一
第一種使用一層while回圈,從100-1000遍歷,取出其個位、十位、百位的數字,進行三次方計算后相加再與原數字對比,相等就列印輸出,
其取出個位、十位、百位的方法需要用到內置函式:CAST函式
CAST函式用于將某種資料型別的運算式顯式轉換為另一種資料型別,如:
cast(substring(cast(@n as varchar(3)),1,1) as int
該陳述句將int型變數n先更改為varchar(可變長度字串)型別,再利用substring函式取出從第1個字符開始的1個字符,即在水仙花數的求取中就是取出了3位數的百位,最后再將其轉化未int型變數,
方法一整體代碼如下:
declare @n int,@x as int,@y as int,@z as int
set @n=100
while @n<1000
begin
set @x=cast(substring(cast(@n as varchar(3)),1,1) as int)
set @y=cast(substring(cast(@n as varchar(3)),2,1) as int)
set @z=cast(substring(cast(@n as varchar(3)),3,1) as int)
if power(@x,3)+power(@y,3)+power(@z,3)=@n
begin
print @n
end
set @n=@n+1
end
用x,y,z分別存盤其百位、十位和個位
方法二
方法二是本人一開始使用的方法,即同樣定義x,y,z存盤其百位、十位和個位,通過3個while回圈,x從1-9遍歷,y、z分別從0-9遍歷,通過x,y,z三次方的和與100x+10y+z對比得到水仙花數,
而一開始錯誤的實作代碼如下:
declare @x int, @y int,@z int,@m int
set @x=1
set @y=0
set @z=0
while @x<10
begin
while @y<10
begin
while @z<10
begin
if power(@x,3)+power(@y,3)+power(@z,3)=(@x*100+@y*10+@z)
begin
select @m=@x*100+@y*10+@z
print @m
end
set @z=@z+1
end
set @y=@y+1
end
set @x=@x+1
end
通過sql server執行代碼后只有命令已成功完成陳述句,并沒有輸出結果,說明代碼有誤
經過檢查,發現有可能是回圈出問題,便用以下代碼進行檢驗:
declare @x int, @y int,@z int,@m int
set @x=1
set @y=0
set @z=0
while @x<10
begin
while @y<10
begin
while @z<10
begin
print @z
set @z=@z+1
end
set @y=@y+1
end
set @x=@x+1
end
發現其輸出結果僅有10次

發現原因是while嵌套回圈外部回圈變數不能進入內部回圈,于是將set @y與set @z陳述句放入內層回圈之前
修正后代碼(正確)如下:
declare @x int, @y int,@z int,@m int
set @x=1
while @x<10
begin
set @y=0
while @y<10
begin
set @z=0
while @z<10
begin
if power(@x,3)+power(@y,3)+power(@z,3)=(@x*100+@y*10+@z)
begin
select @m=@x*100+@y*10+@z
print @m
end
set @z=@z+1
end
set @y=@y+1
end
set @x=@x+1
end
其輸出結果與方法一相同

最后得到153,370,371,407為水仙花數
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/208443.html
標籤:其他
上一篇:Redis(設計與實作):---發布與訂閱之查看訂閱資訊(PUBSUB CHANNELS/NUMSUB/NUMPAT命令)
