題目
輸入數(shù)字n,按順序打印出從1到n最大的n位十進(jìn)制數(shù)。比如輸入3,則打印1、2、3一直到最大的3位數(shù)999
方案
看到題目,首先想到先求出最大的n位數(shù)(maxN),然后從1開(kāi)始遍歷到maxN.但是這里有個(gè)陷進(jìn),就是maxN有可能超出Int或者long long表示的最大數(shù)的范圍,這個(gè)時(shí)候回發(fā)生溢出錯(cuò)誤。
所以這個(gè)時(shí)候要選擇合適的類(lèi)型來(lái)表示maxN,我這里選擇的是用Array來(lái)表示maxN,最高位放到數(shù)組的最前面。以四位數(shù)舉例,585可以表示為[0,5,8,5],
用數(shù)組表示maxN之后,面臨著三個(gè)問(wèn)題:
輸出打印
這個(gè)時(shí)候只需要遍歷數(shù)組,把前面的0去掉即可加1
對(duì)數(shù)組進(jìn)行倒序遍歷,對(duì)后位進(jìn)行+1,若結(jié)果大于9,則把該位置0,繼續(xù)對(duì)前面的數(shù)進(jìn)行+1,若結(jié)果不大于9,則把結(jié)果賦值給當(dāng)前位并停止遍歷何時(shí)停止
若數(shù)組的首位進(jìn)行進(jìn)位時(shí),則表示已經(jīng)遍歷了最大值,需要停止循環(huán)
代碼Swift
func printOneToMaxOfDigits(digitNumber:Int) {
//初始化一個(gè)全為0的長(zhǎng)度為digitNumber的數(shù)組
var array = Array(repeating: 0, count: digitNumber)
//相當(dāng)于生成一個(gè)從digitNumber-1到0的一個(gè)序列
let strideTo = stride(from: digitNumber - 1, to: -1, by: -1)
//對(duì)數(shù)組進(jìn)行加1的函數(shù),若返回false則代表已經(jīng)超出最大值,可以停止了
func addOne() -> Bool{
for index in strideTo {
if array[index] + 1 > 9 {
array[index] = 0
if index == 0 {
return false
}
}else {
array[index] = array[index] + 1
break
}
}
return true
}
//對(duì)數(shù)組進(jìn)行打印
func printArray() {
var result = ""
var isAppend = false
for item in array {
if isAppend || item != 0 {
result += "\(item)"
isAppend = true
}
}
print(result)
}
//調(diào)用加1方法,知道加1方法返回false
while addOne() {
printArray()
}
}
printOneToMaxOfDigits(digitNumber: 5)