日期:2014-05-19  浏览次数:20724 次

散分,也要有技术含量……
这两天手上的工作被block住了(客户的原因),有点无所事事。除了自己看看书,大多时间就泡在CSDN回答问题了。有点无聊……
随便出个算法题,有兴趣的和我一样无聊的朋友作作看,有分送,不够可以另外开贴加。纯顶的就按不给分了,说点精辟的有趣的东西的,按心情给。
题目如下:
输入一个整数n,请计算2^1+2^2+2^3...2^n;


------解决方案--------------------
机器人的王道就是--循环
------解决方案--------------------
哎减2,呵呵
------解决方案--------------------
不过很容易就溢出了,如果没限定N的范围的话就需要用自定义的方式计算和显示结果了。
------解决方案--------------------
radiumhuang() 高等数据学得真好,偶都忘光光啦
------解决方案--------------------
log是怎么定义来着?这不就是跟指数e有关系吗,高数忘光了,等我去翻翻书
书到用时方恨少啊。。。。
------解决方案--------------------
9494 高数一定得好
------解决方案--------------------
好,谢谢。如果要考虑溢出,最简单的方式是自己定义一个乘2的运算,然后用一个循环解决。不过这个方法效率是O(n)。看楼主的样子应该有比这个效率更高的方式。

我想到的另一个方法是,逐位计算。以个位为例,实际上是2的N次方对10取模的结果,其规律是以2,4,8,6的规律变化。每次从8变到6就向10位进一。10位就复杂一些,除了需要考虑自乘2之外还要加上个位的进位。不过我们需要只要找到一个算法计算出每个位上向上位进位的次数以及从低位进位的次数,再考虑其自身的变化就可以逐位计算。这个算法我的感觉应该是O(1)效率的,这样我们就可以的到一个O(logN)的效率的算法。

最近时间比较紧,我慢慢推这个算法,看看能不能干的上,嘿嘿。
------解决方案--------------------
等比数列之和不用高数吧?接分!
------解决方案--------------------
果然有 "记数 " 含量。。。
------解决方案--------------------
2^(n+1) - 2
------解决方案--------------------
前两个不对,没有看清题。

由于2的特殊性,2 + 2^1+2^2+2^3...2^n
可以一直进位,一直到2^ (n+1)
------解决方案--------------------
准备答案

2^(n+1) - 2

------解决方案--------------------
BigInteger

www.codeproject.com/csharp/biginteger.asp
------解决方案--------------------
极为赖皮的方法是结果用二进制表示。
------解决方案--------------------
就是移位操作
------解决方案--------------------
mark
------解决方案--------------------
从二进制来看
2^1 = 10
2^2 = 100
2^3 = 1000
....
那如果加起来
...其实也很简单
也就是
1111...110这样的结果

这个数字应该是要分配个n/8+1字节的内存的整数
然后所有字节全部填满255,在&一个1不就行了...是这样么?
------解决方案--------------------
对,所以只要用 n/32,得到这个mod,就可以算出来了,我正在做程序,看来远水解不了近渴
@_@
------解决方案--------------------
我学了两个月,大家包容包容
static public int Code(int n)
{
int Mul = 2;
while (n != 1)
{
Mul *= 2;
n--;
}


return Mul;

}
static public int Sum(int n)
{
int Add = 0;
for (int i = n; i > = 1; i--)
{
Add += Code(i);
}
return Add;
}
------解决方案--------------------
唉,发现自己的数学基本没剩的了


------解决方案--------------------