對(duì)于比較小的數(shù)字,做運(yùn)算可以直接使用編程語(yǔ)言提供的運(yùn)算符,但是如果相乘的兩個(gè)因數(shù)非常大,語(yǔ)言提供的數(shù)據(jù)類型可能就會(huì)溢出。一種替代方案就是,運(yùn)算數(shù)以字符串的形式輸入,然后模仿我們小學(xué)學(xué)習(xí)的乘法算術(shù)過(guò)程計(jì)算出結(jié)果,并且也用字符串表示。 需要注意的是, 比如說(shuō)我們手算 計(jì)算 你看這個(gè)簡(jiǎn)單過(guò)程,其中涉及乘法進(jìn)位,涉及錯(cuò)位相加,還涉及加法進(jìn)位;而且還有一些不易察覺(jué)的問(wèn)題,比如說(shuō)兩位數(shù)乘以兩位數(shù),結(jié)果可能是四位數(shù),也可能是三位數(shù),你怎么想出一個(gè)標(biāo)準(zhǔn)化的處理方式?這就是算法的魅力,如果沒(méi)有計(jì)算機(jī)思維,簡(jiǎn)單的問(wèn)題可能都沒(méi)辦法自動(dòng)化處理。 首先,我們這種手算方式還是太「高級(jí)」了,我們要再「低級(jí)」一點(diǎn), 這樣可以避免乘法的進(jìn)位,而且例子中 另外,我們可以用一個(gè)數(shù)組在底下接收相加結(jié)果: 整個(gè)計(jì)算過(guò)程大概是這樣,有兩個(gè)指針 現(xiàn)在還有一個(gè)關(guān)鍵問(wèn)題,如何將乘積疊加到 其實(shí),細(xì)心觀察之后就發(fā)現(xiàn), 明白了這一點(diǎn),就可以用代碼模仿出這個(gè)計(jì)算過(guò)程了: 至此,字符串乘法算法就完成了。 總結(jié)一下,我們習(xí)以為常的一些思維方式,在計(jì)算機(jī)看來(lái)是非常難以做到的。比如說(shuō)我們習(xí)慣的算術(shù)流程并不復(fù)雜,但是如果讓你再進(jìn)一步,翻譯成代碼邏輯,并不簡(jiǎn)單。算法需要將計(jì)算流程再簡(jiǎn)化,通過(guò)邊算邊疊加的方式來(lái)得到結(jié)果。 俗話教育我們,不要陷入思維定式,不要程序化,要發(fā)散思維,要?jiǎng)?chuàng)新。但我覺(jué)得程序化并不是壞事,可以大幅提高效率,減小失誤率。算法不就是一套程序化的思維嗎,只有程序化才能讓計(jì)算機(jī)幫助我們解決復(fù)雜問(wèn)題呀! |
|