設萬維讀者為首頁 萬維讀者網 -- 全球華人的精神家園 廣告服務 聯繫我們 關於萬維
 
首  頁 新  聞 視  頻 博  客 論  壇 分類廣告 購  物
搜索>> 發表日誌 控制面板 個人相冊 給我留言
幫助 退出
茶樹油之家  
與大家交流和分享蘋果產品、網絡技術,以及美樂家茶樹油及相關的信息  
https://blog.creaders.net/u/588/ > 複製 > 收藏本頁
網絡日誌正文
一種沒有溢出的算法來解決乘法計算 2011-07-01 10:18:02
我前一段寫了一篇博文分享過一紐約長島女孩(非常可愛聰明的大女孩)用視覺方式計算兩位數的乘法。但是我很快發現,如果最後一位數和中間的和數都大於9的話,就會有一個進位的問題。而且如果視圖中間的交叉點太多,計算起來也十分繁瑣。

但我很快發現這種視覺的方式實際上是將傳統的豎式計算方法用圖像的方式來表達出來,這的確是十分有想象力的。我仔細研究傳統的豎式算法,我發現計算的過程實際上兩個單數不斷相乘的過程,個位數留下,如果有十位數,則十位數進位,然後不斷重複的過程。這用編程的方式來說,實際上可以用兩個循環來模擬進行。因為是兩個單數的相乘,這不會有溢出的問題,在計算過程中,將最左邊的各位數不斷留下來,存放在一個字符的串變量之中,整個循環完成之後,就可以得到結果。這樣就不會有整數溢出的問題(電腦計算過程中,整數是有一定上限的,超過這個上限就會出現溢出)。


根據這個推理邏輯,我用網頁的HTML+Javascript編寫了這個算法的程序。經過調試之後,嘿!還真工作,任何兩位整數的乘法不會出現溢出。


計算程序


下面是我編寫的計算程序:

function v1timesv2(v1, v2) {
  var x = ''// result
  var i = 0;
  var j = 0;
  var r;
  var r1;
  var r2;
  var k;
  var tempVal;
  var preTempVal = '';
  debug ('v1: ' + v1);
  debug ('v2: ' + v2);
  for (i= v2.length-1; i >= 0; i--) // v2
  {
    r2 = 0;
    tempVal = '';
    k = preTempVal.length;
    for (j=v1.length-1;j >=0; j--)  // v1
    {
      if ((k--) > 0)
      {
        r2 += Number(preTempVal[k]);
      }
      r = v1[j] * v2[i] + r2;
      r1 = r % 10;
      r2 = 0;
      if ( r > 9 )
      {
        r2 = (r - r1) / 10;
      }
      tempVal = r1 + tempVal;
    }
    if ( r > 9 )
    {
       tempVal = r2 + tempVal;
    }
    debug('intermediate calculated result: ' + tempVal);
    // Get the last char as result
    x = tempVal[tempVal.length - 1] + x;
    debug('intermediate result: ' + x);
    // Get the remaining as previous val
    if ( tempVal.length > 1 ) 
    {
      preTempVal = tempVal.substr(0, tempVal.length - 1);
    }
    else
    {
      preTempVal= '';
    }
    debug('== carry forward result: ' + preTempVal + ' ==' );
  }
  x = preTempVal + x;
  debug('>>final result:    ' + x);
  debug('>>verified result: ' + Number(v1) * Number(v2) + ' (' + v1 + ' x ' + v2 + ')');
  return x ;
}


我的算法肯定不是最優化的方式,如有高手,請多多糾正指導。


原程序和計算網頁


為了方便進行調試,我採用了Javascript方式寫計算的程序,然後利用網頁HTML的方式將程序隱藏在文件的header部分,網頁的body部分為用戶界面,你可以輸入兩個整數,點擊計算button就可以得到沒有溢出的計算結果。


第一行是格式化的計算結果,這樣方便讀;第二行是計算的結果(括號內是原第一個被乘數和第二個乘數);第三行是兩個整數乘積的結果,注意,JavaScript是動態數據類型,如果結果太大,整數的結果會自動轉變為科學的浮動數字結果,如果輸入整數超大,有可能出現無法計算的無窮大的數字。我的這個小JavaScript程序計算方法可以計算任何兩位整數的乘積。請從後面的參考中試試我的乘法計算網頁或下載原碼用你的網頁瀏覽器試試。

注意:該HTML網頁沒有檢測你的輸入數據是否是整數,如果輸入其它無效字符則不會得到計算結果。

如果你是用Safari,Chrome,Firefox網絡瀏覽器,右點鼠標鍵打開監視網頁元素(inspect elements),然後點擊Console,這樣你還會看到計算過程中我加入的debug計算詳細信息:



隨後感


英特網的出現使得信息出現空前的膨脹,我記得一次在聽《吳東相對論》播客中,他們提到現在許多多人因為網絡信息太多而不願讀書,而且對許多信息也沒有真正的分析的興趣,什麼都是一覽而過,大腦越來越遲鈍。對於年輕來說,大量的信息反而造成他們的學習能力降低。

我每天也快速瀏覽許多網絡中的許多東西,但是我有一個習慣,如果發現特別有興趣的東西,我特別喜歡品味和琢磨,有機會和同事或朋友們分享。別小看分享過程,這是一個將吸收的東西再加工和表述的過程。我經常發現在表述的過程中突然卡住,無法將我的想法流暢的表述出來。在這種情況下,我再回去認真讀覽,查詢其它的資料,直到我感到能夠完全理解和備有豐富的支持資料之後,我就會感到我能夠再次有信心地表述一次。

這次我是通過視覺計算的啟發,迅速聯想到我編程過程中經常遇到的溢出問題,在仔細研究之後,開始對自己的新想法加以驗證,結果得到這種算法的答案。這是一個絞盡腦汁的過程,需要知識和全神貫注的投入,我們的大腦不正是需要這樣的鍛煉過程嗎?

參考資料



我的RSS
瀏覽(2469) (0) 評論(0)
發表評論
我的名片
茶樹油之家
來自: 加拿大
註冊日期: 2007-01-19
訪問總量: 563,228 次
點擊查看我的個人資料
Calendar
最新發布
· ZOOM 會議:iOS 平台上的軟件開
· 專注做一件事是最好的擺脫
· 我的 iOS app 更新了
· 有關老面製作的問與答(三)
· 從Legacy 小道,我重新開始了跑
· 從Legacy 小道,我重新開始了跑
· 為準備馬拉松長跑的第一次嘗試
分類目錄
【社會公益】
· 飄香茉莉 - 李靖惠
· 天使的恩賜
· 經典京劇『鎖麟囊』
· 挑戰自己:參加2013卡爾加里馬拉
· 夢想合唱團大聚會與奧運夢想
· 中央電視台的夢想合唱團公益活動
【WWDC】
· 學習WWDC 2017
· 學習WWDC 2015
· 網上學習:WWDC 2013視頻講座
· WWDC 2013技術講座視頻
· WWDC 2012筆記(4)
· WWDC2012的學習筆記(3)
· WWDC 2012的學習筆記(2)
· WWDC 2012的學習筆記(1)
· WWDC2011視頻的學習筆記(21)
· WWDC2011視頻的學習筆記(19)
【網絡安全】
· Heartbleed網絡安全漏洞
· 蘋果小技巧:如何在PDF文件上加
· 警惕你的蘋果禮物卡被竊
· 蘋果用戶的獨特免疫能力
· 蘋果發布安全更新2011-003
· 最新的微軟IE漏洞和劫持Cookie的
· 新的惡意軟件第二番攻擊蘋果
· 新的惡意軟件開始攻擊蘋果
【生活與健康】
· 有關老面製作的問與答(三)
· 從Legacy 小道,我重新開始了跑
· 從Legacy 小道,我重新開始了跑
· 為準備馬拉松長跑的第一次嘗試
· 張宏文與西班牙華人的醫療諮詢
· 有關老面製作的問與答(二)
· 美麗的洛基山脈
· 有關老面製作的問與答(一)
· 我為什麼喜歡蘋果
· 加拿大抗新冠病毒動態 2020.4.16
【TED視頻】
· 請求的藝術
· TED有關兩種不同政治制度的精彩
· 游擊隊方式的城市菜園
· 玩遊戲可以多活十年
· 中毒寶寶
· 中美關係不需要多一個律師
· TED視頻:脆弱的力量
· TED視頻精選:戴維·卡梅倫論政府
· TED視頻:為什麼SOPA是一個餿主
· TED視頻:失敗是成功之母
【海外生活】
· 從Legacy 小道,我重新開始了跑
· 從Legacy 小道,我重新開始了跑
· 為準備馬拉松長跑的第一次嘗試
· 張宏文與西班牙華人的醫療諮詢
· 有關老面製作的問與答(二)
· 美麗的洛基山脈
· 有關老面製作的問與答(一)
· 我為什麼喜歡蘋果
· 加拿大抗新冠病毒動態 2020.4.16
· 加拿大抗新冠病毒動態 2020.4.16
【網絡服務】
· 專注做一件事是最好的擺脫
· 谷歌帳號和相應的雲服務
· 用圖像和風格語言css 定義數字章
· 網絡服務:計算型知識引擎服務
· 如何優化圖像所占用的空間
· 用視覺方式快速算算數
· 新浪【船過水無痕】的博文,非常
· 蘋果的雲服務iCloud與谷歌的雲服
· 新浪微博對話實例
· 使用網絡翻譯服務,寫中文博客
【軟件開發】
· ZOOM 會議:iOS 平台上的軟件開
· 專注做一件事是最好的擺脫
· 我的 iOS app 更新了
· iOS App: TapToCount - 3W
· 第一個iOS app 的里程碑
· TestFlight - 蘋果iOS app測試的
· 24點的算法
· 學習WWDC 2015
· 漢字聽寫大會-電腦書寫輸入法
· WWDC2012的學習筆記(3)
【我愛蘋果】
· ZOOM 會議:iOS 平台上的軟件開
· 我為什麼喜歡蘋果
· iOS App: TapToCount - 3W
· 為武漢發生COVID-19疫情做一點貢
· 第一個iOS app 的里程碑
· 創作app的樂趣
· 你知道你的睡覺節奏規律嗎?
· 學習WWDC 2017
· 點擊計數 - 記住隨時隨地的點滴
· 學習WWDC 2015
【網絡技術】
· 專注做一件事是最好的擺脫
· 如何用 Blogger 邀請朋友共同寫
· 今天是3.14日,以及VIM的強大區
· 探討:採用QR碼快速連接Wi-Fi
· 互聯網+和微信
· 寫博客的體會
· WA實例:分數的計算
· 如何將XML內容用HTML格式表述
· 如何優化圖像所占用的空間
· 谷歌博客更新:增加動態放大圖像
【茶樹油】
· 有關老面製作的問與答(三)
· 茶樹精油消毒殺菌的熏蒸法
· 新冠病毒核酸檢測之淺解
· 倡議:聯合海外華人寫抗疫日記
· 茶樹精油新用法:消毒和清潔面部
· 為關心COVID-19疫情寫的小詩
· 為武漢發生COVID-19疫情做一點貢
· 2018,達到一萬公里里程碑!
· Melaleuca 2017/12/26 年銷售額
· 跑步里程達到八千公里
存檔目錄
2020-05-11 - 2020-05-21
2020-04-04 - 2020-04-23
2020-03-01 - 2020-03-31
2020-01-07 - 2020-01-25
2019-03-20 - 2019-03-20
2019-02-09 - 2019-02-09
2018-12-31 - 2018-12-31
2018-05-18 - 2018-05-18
2017-12-09 - 2017-12-26
2017-10-19 - 2017-10-19
2017-09-06 - 2017-09-06
2017-08-17 - 2017-08-17
2017-06-07 - 2017-06-28
2017-04-12 - 2017-04-28
2017-03-31 - 2017-03-31
2017-02-22 - 2017-02-22
2017-01-18 - 2017-01-23
2016-10-25 - 2016-10-25
2016-03-21 - 2016-03-21
2016-02-01 - 2016-02-17
2016-01-12 - 2016-01-22
2015-12-04 - 2015-12-11
2015-11-19 - 2015-11-24
2015-10-14 - 2015-10-14
2015-08-05 - 2015-08-05
2015-07-24 - 2015-07-24
2015-04-06 - 2015-04-24
2015-03-14 - 2015-03-18
2015-02-05 - 2015-02-05
2015-01-20 - 2015-01-20
2014-12-13 - 2014-12-13
2014-11-13 - 2014-11-13
2014-10-01 - 2014-10-10
2014-09-01 - 2014-09-24
2014-08-07 - 2014-08-29
2014-07-11 - 2014-07-31
2014-06-23 - 2014-06-23
2014-05-02 - 2014-05-31
2014-04-20 - 2014-04-27
2014-02-14 - 2014-02-14
2014-01-06 - 2014-01-29
2013-12-02 - 2013-12-30
2013-11-06 - 2013-11-18
2013-10-12 - 2013-10-30
2013-09-03 - 2013-09-03
2013-08-01 - 2013-08-23
2013-07-05 - 2013-07-30
2013-06-03 - 2013-06-14
2013-04-03 - 2013-04-30
2013-03-07 - 2013-03-30
2013-02-18 - 2013-02-23
2012-12-05 - 2012-12-25
2012-11-08 - 2012-11-25
2012-10-05 - 2012-10-18
2012-09-26 - 2012-09-26
2012-08-03 - 2012-08-25
2012-07-07 - 2012-07-27
2012-06-01 - 2012-06-28
2012-05-01 - 2012-05-27
2012-04-08 - 2012-04-27
2012-03-03 - 2012-03-31
2012-02-07 - 2012-02-29
2012-01-15 - 2012-01-27
2011-12-03 - 2011-12-20
2011-11-02 - 2011-11-22
2011-10-01 - 2011-10-30
2011-09-03 - 2011-09-24
2011-08-01 - 2011-08-31
2011-07-01 - 2011-07-30
2011-06-01 - 2011-06-29
2011-05-01 - 2011-05-31
2011-04-02 - 2011-04-30
2007-01-19 - 2007-01-19
 
關於本站 | 廣告服務 | 聯繫我們 | 招聘信息 | 網站導航 | 隱私保護
Copyright (C) 1998-2026. Creaders.NET. All Rights Reserved.