主题Bignumber(大数).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
主题Bignumber(大数).ppt

主題: Big number (大數) 解題技巧 什麼是大數? 大數運算 加法 減法 乘法 例題講解: H.91.4 歷年題目 什麼是大數? 怎麼存下面的數字 100000 : int (-231 ~ 231-1) 10000000000 : __int64 (-263 ~ 263-1) 1000000000000000000000 : 怎麼存? 目前 C 只能用 64 bit 儲存整數,64 bit 存不下的數字就稱為大數 如何儲存大數 正確評估 max_len 最大數要多少位元 (10 進位),保證不會 overflow 5 位數 + 4 位數 = 6 位數 5 位數 × 4 位數 = 9 位數 用 string 來儲存 char x[max_len+1] x = “684597315274” 將每個位數用一個字元來儲存,運算時再轉換回數字 如何儲存大數 用整數陣列來儲存 (for 運算,較容易) int num[max_len] = { 4, 7, 2, 5, 1, 3, 7, 9, 5, 4, 8, 6, 0, ..., 0} 要記得補 0 不補 0 要記有效位元長度,速度快但程式不好寫 大數運算 大數運算 加法 乘法 減法 大數加法 原理 既然 C 程式內建的加法不能用,那就用最原始的加法 要注意進位的動作 資料結構 int num1[max_len], num2[max_len] 用來儲存數字 int answer[max_len] 用來儲存結果 int carry 大數加法 123456789 + 987654321 ? 把 123456789 存在 num1 之中,987654321 存在 num2,結果存在 answer 中 C code void big_add( int *num1, int *num2, int *answer ){ int i; carry = 0; for ( i = 0 ; i max_len ; i++) { answer[ i] = (num1[ i] + num2[ i] + carry) % 10; carry = (num1[ i] + num2[ i] + carry) / 10; } if (carry != 0) printf(“Overflow!!!\n”); } 大數乘法 原理 乘法其實就是很多個加法 注意進位和位數 資料結構 num1, num2, carry 和加法一樣 中間的過程要用二維陣列來儲存? 不用,和加法一樣只需要一個一維陣列 answer 每次有新的值乘出來之後,就把它加到適當的位置去 C code void big_mul( int *num1, int *num2, int *answer ){ int i, j; for (i = 0; i max_len) ; i++){ carry = 0; for (j = 0; j max_len ; j++){ if (( i + j ) max_len) answer[i+j] = (answer[i+j] + num1[j] * num2[i] + carry) % 10; carry= (answer[i+j] + num1[j] * num2[i] + carry) / 10; } } } 小技巧 在做大數運算時,可以將數個位數當成同一個位數來運算 之前的例子都是十進位,若換成百進位的話結果會如何? 當每一次運算所使用的位數增加時,總共所需要計算的次數就會減少,所要開的陣列大小也跟著變少 若陣列的型態為整數的話,則最多只能以萬進位為計算的單位 10000*10000 2^32 大數減法 原理 跟加法、乘法差不多 要注意借位 可以先判斷減數或被減數大,拿大的去減小的,最後再補正負號即可 大數減法 425 – 4178 = – (4178 – 425 ) = –3753 C code /* 假設 num1 比 num2 大 */ void big_sub( int * num1, int *num2, int *answer ){ int i; carry = 0; for (i = 0; i max_len ; i++) { answer[ i] = num1[ i] – num2[ i] + carry; if (answer[ i] 0) { answer[ i] = answer[ i] + 10; // 若是百進位則加100 carry = -1;

文档评论(0)

jiyudian + 关注
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档