计算 2 的 1000次方

参考自:http://www.cnblogs.com/herbert/archive/2011/02/13/1953943.html

Project Euler problem 16

215 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26.

What is the sum of the digits of the number 21000?

计算 2 的 1000次方的所有数字的和?

这个设计大数乘方问题,通用的思路就是采用数组来分段处理大数,分段表示大数。下面的算法中,我采用的是“万进制”,用数组来存储数据。

原理如下:

先说计数方法:

比如

2 的 26次方

num= 67108864

我们可以这样来写这个数:

6710 8864

令arr[0] = 6710, arr[1] = 8864

那么,arr数组看起来就象和67108864是一样的

看到这里你明白了吧?

我们可以分段表示一个非常大的数而不必考虑它的溢出,

而只用考虑段数是否大于一个数即可

举个例子:

上边,单段的最大值是9999,每段不溢出

那么,num就不会溢出

再一个乘法.

我们老祖宗给我们留下的算盘,很妙,

它其实就是最基本的计算机之一

我们算乘方时,

只用乘以一个数:

这样来列式子:

123456790

*2=

--------------

246913580

即:

123               456                   790

*2=             *2=                   *2=

-----         -----             ------

246               912                 (1)580(溢出)       第三段有溢出,加到上一段

-----       -----             --------

246             913                     580

呵呵,就这样,打算盘一样,进位.

最后是我自己(cutebear)用c#写的,测试通过:

        private static string BigNumberPow(int baseNumber, int power)        {// Math.Log10(x^y) = y * Math.Log10(x).// 估计结果有多少位。            double rawDigitCount = power * Math.Log10((double)baseNumber);double digitCount = (int)(Math.Ceiling(rawDigitCount));// 这里用万进制,即满一万进1,运算过程用数组来存放,数组中每一个的最大值是9999。// 除以4,得到所需的数组的长度。            int arrayLength = (int)(Math.Ceiling((double)(digitCount / 4.0)));

int[] numbers = new int[arrayLength];int jinweinumber = 0;// 模拟人工运算,设置初始值。            numbers[arrayLength - 1] = baseNumber;// 由于设置了初始值,所以需要乘以baseNumber共power -1次。            for (int j = 1; j < power; j++)            {// 对每一段乘以baseNumber,注意进位的值要加到前一段。                for (int i = arrayLength - 1; i >= 0; i--)                {if (numbers[i] == 0 && jinweinumber == 0)continue;                    numbers[i] = numbers[i] * baseNumber;                    numbers[i] += jinweinumber;if (numbers[i] > 9999)                    {                        var quyu = numbers[i] % 10000;                        jinweinumber = (numbers[i] - quyu) / 10000;                        numbers[i] = quyu;                    }else                        jinweinumber = 0;                }            }

            StringBuilder result = new StringBuilder();for (int i = 0; i < arrayLength; i++)            {// 不足四位的前面补0。                result.Append(numbers[i].ToString("0000"));            }

return result.ToString().TrimStart('0');        }

同理,下面是计算大数的阶乘:

private static string JieCh(int n)        {// 使用万进制,每个数组元素四位,估计用来存计算结果所需数组的长度。            int arraylength = 50;int[] numbers = new int[arraylength];            numbers[arraylength - 1] = 1;for (int j = 2; j <= n; j++)            {int jinweinumber = 0;for (int i = arraylength - 1; i >= 0; i--)                {                    numbers[i] *= j;                    numbers[i] += jinweinumber;if (numbers[i] > 9999)                    {                        var quyu = numbers[i] % 10000;                        jinweinumber = (numbers[i] - quyu) / 10000;                        numbers[i] = quyu;                    }else                        jinweinumber = 0;                }            }            StringBuilder result = new StringBuilder();for (int i = 0; i < arraylength; i++)            {                result.Append(numbers[i].ToString("0000"));            }

return result.ToString().TrimStart('0');        }

posted on 2011-08-17 16:35 cutebear 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/bear831204/archive/2011/08/17/2143278.html

计算 2 的 1000次方相关推荐

  1. 计算2的1000次方

    今天看到一道腾讯笔试题:计算2的1000次方,并打印出来,限时20分钟. 计算机里面,乘以2可以用移位操作进行优化,先用浮点数实现,具体思路如下: int factor = 1000; // 1000 ...

  2. 关于2的1000次方

    之前看到文章说,一道面试题,计算2的1000次方. 底下的评论基本上都是说因为数据长度非常大,需要按数据的每一位来创造数组,按数组的每位做循环计算. 如果用js的话,一行代码搞定,而且速度很快,耗时4 ...

  3. c语言计算2的n次方(可以1000次方以上)(利用数组)

    #include<stdio.h> #include<stdlib.h> //计算2的n次方,创建数组赋予足够大的空间,使用for循环执行n次,如果a[i]>9则a[i] ...

  4. 信息学奥数一本通(1170:计算2的N次方)

    1170:计算2的N次方 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 15778     通过数: 8179 [题目描述] 任意给定一个正整数N(N<=1 ...

  5. 12:计算2的N次方

    原题链接 总时间限制:  1000ms  内存限制:  65536kB 描述 任意给定一个正整数N(N<=100),计算2的n次方的值. 输入 输入一个正整数N. 输出 输出2的N次方的值. 样 ...

  6. 39页第7题 计算2的i次方之和

    /*计算2的i次方之和*/ #include<stdio.h> #include<math.h>/*调用math.h文件中的函数*/ int main(void) {int n ...

  7. Python计算 1的9999999次方,不到1s就得出答案!是如何处理的?

    问题引发 网友计算1的9999999次方,不到1s就得出答案.那python是如何处理的? >>> a=1 >>> i=a**9999999 >>> ...

  8. 从键盘上录入两个整数,计算a的b次方的结果

    从键盘上录入两个整数,计算a的b次方的结果 /*** 从键盘上录入两个整数,计算a的b次方的结果*/import java.util.Scanner;public class Test25 {publ ...

  9. 信息学奥赛一本通 1170:计算2的N次方 | OpenJudge NOI 1.6 12:计算2的N次方

    [题目链接] ybt 1170:计算2的N次方 OpenJudge NOI 1.6 12:计算2的N次方 [题目考点] 1. 高精度 考察:高精乘低精 高精度计算讲解 2. 快速幂 [解题思路] 先估 ...

最新文章

  1. TF之DCGAN:基于TF利用DCGAN测试MNIST数据集并进行生成过程全记录
  2. 我们工作到底为了什么(这篇文章很重要)----强烈推荐
  3. 在ubuntun虚拟机里安装goLang语言编程环境
  4. python 语音识别机器人控制系统_python实现百度语音识别api
  5. scala不可变和可变_Scala使期货变得轻松
  6. shell学习脚本-tomcat停止脚本
  7. 英文c语言笔试题,关于C语言模拟笔试题
  8. 处理 ODBC, OLE DB, 和 SQL Server .NET Provider 中的异常
  9. 突击计划——银行利息
  10. 京东物流首架全货机首航 久未露面的刘强东还发声推广
  11. autojs之七牛直播云
  12. 虎牙服务器升级维护中 请留意公告,魔渊之刃像素危城系列活动上线-更新公告1月21日...
  13. 信息系统项目管理十大管理过程整理
  14. 2086689-01-0,N-(Azido-PEG2)-N-Boc-PEG3-acid末端羧酸可在活化剂(例如EDC或HATU)存在下与伯氨基反应
  15. TestCenter IGMP Proxy组播测试(bridge)
  16. 红尘牵绊,江湖儿女惹情长
  17. 为什么建议iOS开发使用Swift
  18. 合并两个递增的有序数组
  19. dxp全称_DXP元件名字库
  20. 【GitLens】VsCode插件,查看代码是谁写的

热门文章

  1. APP(UniAPP) 支付宝支付操作指导 + 遇到的坑(PHP实现)
  2. Flask 引入swagger
  3. 动态规划之线性DP题集
  4. 体验 TiDB v6.0.0 之 Clinic
  5. WIN10与XP共享连接打印机
  6. Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据
  7. 我大一的线性代数学习
  8. Handsontable JavaScript Excel Crack
  9. python画三瓣树叶_用Python能画哪些树?
  10. Google支付相关