计算 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'); }
转载于:https://www.cnblogs.com/bear831204/archive/2011/08/17/2143278.html
计算 2 的 1000次方相关推荐
- 计算2的1000次方
今天看到一道腾讯笔试题:计算2的1000次方,并打印出来,限时20分钟. 计算机里面,乘以2可以用移位操作进行优化,先用浮点数实现,具体思路如下: int factor = 1000; // 1000 ...
- 关于2的1000次方
之前看到文章说,一道面试题,计算2的1000次方. 底下的评论基本上都是说因为数据长度非常大,需要按数据的每一位来创造数组,按数组的每位做循环计算. 如果用js的话,一行代码搞定,而且速度很快,耗时4 ...
- c语言计算2的n次方(可以1000次方以上)(利用数组)
#include<stdio.h> #include<stdlib.h> //计算2的n次方,创建数组赋予足够大的空间,使用for循环执行n次,如果a[i]>9则a[i] ...
- 信息学奥数一本通(1170:计算2的N次方)
1170:计算2的N次方 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 15778 通过数: 8179 [题目描述] 任意给定一个正整数N(N<=1 ...
- 12:计算2的N次方
原题链接 总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个正整数N(N<=100),计算2的n次方的值. 输入 输入一个正整数N. 输出 输出2的N次方的值. 样 ...
- 39页第7题 计算2的i次方之和
/*计算2的i次方之和*/ #include<stdio.h> #include<math.h>/*调用math.h文件中的函数*/ int main(void) {int n ...
- Python计算 1的9999999次方,不到1s就得出答案!是如何处理的?
问题引发 网友计算1的9999999次方,不到1s就得出答案.那python是如何处理的? >>> a=1 >>> i=a**9999999 >>> ...
- 从键盘上录入两个整数,计算a的b次方的结果
从键盘上录入两个整数,计算a的b次方的结果 /*** 从键盘上录入两个整数,计算a的b次方的结果*/import java.util.Scanner;public class Test25 {publ ...
- 信息学奥赛一本通 1170:计算2的N次方 | OpenJudge NOI 1.6 12:计算2的N次方
[题目链接] ybt 1170:计算2的N次方 OpenJudge NOI 1.6 12:计算2的N次方 [题目考点] 1. 高精度 考察:高精乘低精 高精度计算讲解 2. 快速幂 [解题思路] 先估 ...
最新文章
- TF之DCGAN:基于TF利用DCGAN测试MNIST数据集并进行生成过程全记录
- 我们工作到底为了什么(这篇文章很重要)----强烈推荐
- 在ubuntun虚拟机里安装goLang语言编程环境
- python 语音识别机器人控制系统_python实现百度语音识别api
- scala不可变和可变_Scala使期货变得轻松
- shell学习脚本-tomcat停止脚本
- 英文c语言笔试题,关于C语言模拟笔试题
- 处理 ODBC, OLE DB, 和 SQL Server .NET Provider 中的异常
- 突击计划——银行利息
- 京东物流首架全货机首航 久未露面的刘强东还发声推广
- autojs之七牛直播云
- 虎牙服务器升级维护中 请留意公告,魔渊之刃像素危城系列活动上线-更新公告1月21日...
- 信息系统项目管理十大管理过程整理
- 2086689-01-0,N-(Azido-PEG2)-N-Boc-PEG3-acid末端羧酸可在活化剂(例如EDC或HATU)存在下与伯氨基反应
- TestCenter IGMP Proxy组播测试(bridge)
- 红尘牵绊,江湖儿女惹情长
- 为什么建议iOS开发使用Swift
- 合并两个递增的有序数组
- dxp全称_DXP元件名字库
- 【GitLens】VsCode插件,查看代码是谁写的