设万维读者为首页 万维读者网 -- 全球华人的精神家园 广告服务 联系我们 关于万维
 
首  页 新  闻 视  频 博  客 论  坛 分类广告 购  物
搜索>> 发表日志 控制面板 个人相册 给我留言
帮助 退出
茶树油之家  
与大家交流和分享苹果产品、网络技术,以及美乐家茶树油及相关的信息  
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
浏览(2176) (0) 评论(0)
发表评论
我的名片
茶树油之家
来自: 加拿大
注册日期: 2007-01-19
访问总量: 509,835 次
点击查看我的个人资料
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-2024. Creaders.NET. All Rights Reserved.