- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在解决一个简单的组合问题,其解是 2^(n-1)。
唯一的问题是 1 <= n <= 2^31 -1(带符号的 32 位整数的最大值)
我尝试使用 Java 的 BigInteger 类,但它会在数字 2^31/10^4 和更大的时候超时,所以这显然行不通。
此外,我仅限于使用 Java 或 C++ 的内置类。
知道我需要速度,所以我选择用 C++ 构建一个对字符串进行算术运算的类。
现在,当我做乘法时,我的程序乘法类似于我们在纸上乘法以提高效率(而不是重复添加字符串)。
但即使有了它,我也不能将 2 本身乘以 2^31 - 1 次,它的效率不够。
所以我开始阅读关于这个问题的文章,然后我找到了解决方案......
2^n = 2^(n/2) * 2^(n/2) * 2^(n%2)
(其中/表示整数除法,% 表示模数)
这意味着我可以解决对数乘法的求幂问题。但对我来说,我无法解决如何将此方法应用于我的代码?如何选择下限以及跟踪最终乘法所需的各种数字的最有效方法是什么?
如果有人知道如何解决这个问题,请详细说明(感谢示例代码)。
更新
感谢大家的帮助!显然,这个问题应该以一种现实的方式来解决,但我确实设法通过仅执行 ceil(log2(n)) 迭代的幂函数胜过 java.math.BigInteger
。
如果有人对我生成的代码感兴趣,请看这里...
using namespace std;
bool m_greater_or_equal (string & a, string & b){ //is a greater than or equal to b?
if (a.length()!=b.length()){
return a.length()>b.length();
}
for (int i = 0;i<a.length();i++){
if (a[i]!=b[i]){
return a[i]>b[i];
}
}
return true;
}
string add (string& a, string& b){
if (!m_greater_or_equal(a,b)) return add(b,a);
string x = string(a.rbegin(),a.rend());
string y = string(b.rbegin(),b.rend());
string result = "";
for (int i = 0;i<x.length()-y.length()+1;i++){
y.push_back('0');
}
int carry = 0;
for (int i =0;i<x.length();i++){
char c = x[i]+y[i]+carry-'0'-'0';
carry = c/10;
c%=10;
result.push_back(c+'0');
}
if (carry==1) result.push_back('1');
return string(result.rbegin(),result.rend());
}
string multiply (string&a, string&b){
string row = b, tmp;
string result = "0";
for (int i = a.length()-1;i>=0;i--){
for (int j= 0;j<(a[i]-'0');j++){
tmp = add(result,row);
result = tmp;
}
row.push_back('0');
}
return result;
}
int counter = 0;
string m_pow (string&a, int exp){
counter++;
if(exp==1){
return a;
}
if (exp==0){
return "1";
}
string p = m_pow(a,exp/2);
string res;
if (exp%2==0){
res = "1"; //a^exp%2 is a^0 = 1
} else {
res = a; //a^exp%2 is a^1 = a
}
string x = multiply(p,p);
return multiply(x,res);
//return multiply(multiply(p,p),res); Doesn't work because multiply(p,p) is not const
}
int main(){
string x ="2";
cout<<m_pow(x,5000)<<endl<<endl;
cout<<counter<<endl;
return 0;
}
最佳答案
如@Oli 的回答所述,这不是计算 2^n
的问题,因为它通常只是 1
后跟 0
s 二进制。
但是既然你想以十进制打印出来,这就变成了一个问题,即对于非常大的数字,如何将二进制转换为十进制。
我的回答是这不现实。(我希望这个问题只是出于好奇。)
您提到尝试计算 2^(2^31 - 1)
并以十进制打印出来。该数字的长度为 646,456,993 位。
O(n^2)
算法。General::ovfl : Overflow occurred in computation.
如果您只想查看部分答案:
2^(2^31 - 1) = 2^2147483647 =
880806525841981676603746574895920 ... 7925005662562914027527972323328
(total: 646,456,993 digits)
这是使用闭源库完成的,在 Core i7 2600K @ 4.4 GHz 上花费了大约 37 秒和 3.2 GB 的内存,包括将所有 6.46 亿位数字写入大型文本文件所需的时间。
(记事本打开文件所花的时间比计算文件所花的时间要长。)
现在要回答您在一般情况下如何实际计算这种幂的问题,@dasblinkenlight 给出了 Exponentiation by Squaring 变体的答案。
将大数从二进制转换为十进制是一项艰巨的任务。这里的标准算法是 Divide-and-Conquer conversion 。
我不建议您尝试实现后者 - 因为它远远超出了新手程序员的范围。 (并且还有些数学密集型)
关于c++ - 巨大数字的有效指数(我说的是 Googols),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8771713/
fiddle :http://jsfiddle.net/rtucgv74/ 我正在尝试将第一个字符与 3 位数字匹配。所以下面的代码应该提醒f234。但反而返回 null ? 源代码: var reg
复制代码 代码如下: Dim strOk,strNo strOk = "12312321$12
我想找 {a number} / { a number } / {a string}模式。我可以得到number / number工作,但是当我添加 / string它不是。 我试图找到的例子: 15
我,我正在做一个模式正则表达式来检查字符串是否是: 数字.数字.数字,如下所示: 1.1.1 0.20.2 58.55541.5221 在java中我使用这个: private static Patt
我有一个字符串,我需要检查它是否在字符串的末尾包含一个数字/数字,并且需要将该数字/数字递增到字符串末尾 +1 我会得到下面的字符串 string2 = suppose_name_1 string3
我正在寻找一个正则表达式 (数字/数字),如(1/2) 数字必须是 1-3 位数字。我使用 Java。 我认为我的问题比正则表达式更深。我无法让这个工作 String s ="(1/15)";
谁能帮我理解为什么我在使用以下代码时会出现类型错误: function sumOfTwoNumbersInArray(a: [number, number]) { return a[0] +
我看到有些人过去也遇到过类似的问题,但他们似乎只是不同,所以解决方案也有所不同。所以这里是: 我正在尝试在 Google Apps 脚本中返回工作表的已知尺寸范围,如下所示: var myRange
我试图了解python中的正则表达式模块。我试图让我的程序从用户输入的一行文本中匹配以下模式: 8-13 之间的数字“/” 0-15 之间的数字 例如:8/2、11/13、10/9 等。 我想出的模式
简单地说,我当前正在开发的程序要求我拆分扫描仪输入(例如:2 个火腿和奶酪 5.5)。它应该读取杂货订单并将其分成三个数组。我应该使用 string.split 并能够将此输入分成三部分,而不管中间字
(number) & (-number) 是什么意思?我已经搜索过了,但无法找到含义 我想在 for 循环中使用 i & (-i),例如: for (i = 0; i 110000 .对于i没有高于
需要将图像ID设置为数字 var number = $(this).attr('rel'); number = parseInt(number); $('#carousel .slid
我有一个函数,我想确保它接受一个字符串,后跟一个数字。并且可选地,更多的字符串数字对。就像一个元组,但“无限”次: const fn = (...args: [string, number] | [s
我想复制“可用”输入数字的更改并将其添加或减去到“总计”中 如果此人将“可用”更改为“3”,则“总计”将变为“9”。 如果用户将“可用”更改为“5”,则“总计”将变为“11”。 $('#id1').b
我有一个与 R 中的断线相关的简单问题。 我正在尝试粘贴,但在获取(字符/数字)之间的断线时遇到问题。请注意,这些值包含在向量中(V1=81,V2=55,V3=25)我已经尝试过这段代码: cat(p
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我在 Typescript 中收到以下错误: Argument of type 'number[]' is not assignable to parameter of type 'number' 我
在本教程中,您将通过示例了解JavaScript 数字。 在JavaScript中,数字是基本数据类型。例如, const a = 3; const b = 3.13; 与其他一些编程语言不同
我在 MDN Reintroduction to JavaScript 上阅读JavaScript 数字只是浮点精度类型,JavaScript 中没有整数。然而 JavaScript 有两个函数,pa
我们在 Excel 中管理库存。我知道这有点过时,但我们正在发展商业公司,我们所有的钱都被困在业务上,没有钱投资 IT。 所以我想知道我可以用Excel自动完成产品编号的方式进行编程吗? 这是一个产品
我是一名优秀的程序员,十分优秀!