代码之家  ›  专栏  ›  技术社区  ›  Wayne Werner

C++中的双精度(或POW(2, 1000))

  •  2
  • Wayne Werner  · 技术社区  · 16 年前

    我正在研究Euler项目,以弥补我的C++编码技巧,为下学期我们将要面临的编程挑战做好准备(因为他们不让我们使用Python,嘘!)

    我在16号,我在想办法保持2的准确度°°°

    int main(){
        double num = pow(2, 1000);
        printf("%.0f", num):
        return 0;
    }
    

    印刷品

    10715086071862673209484250490600018105614050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    >>> 2**1000

    107150860718626732094842504906000181056140481170553360744375038837035105112493612249319837881569581127594672917553146825187145285692314043598457757469857480394546748242309854210746050627114187541821530474983581941267398765916559460770629145711964786216766042316524386720566806936L

    当然,我可以用python1语言编写程序

    sum(int(_) for _ in str(2**1000))
    

    这给了我即时的结果,但是我正在努力寻找一种在C++中实现的方法。有什么建议吗(哈哈……)

    编辑:

    标准libs之外的东西对我来说毫无价值——在那些比赛中只允许死树代码,我可能不会打印出10000行外部代码。。。

    7 回复  |  直到 11 年前
        1
  •  7
  •   Community Mohan Dere    6 年前

    如果只跟踪字符数组中的每个数字,这很简单。将一个数字加倍是很简单的,如果结果大于10,你只需减去10,然后在下一个数字上加一个进位。从值1开始,在倍增函数上循环1000次,就完成了。你可以预测你需要的数字 ceil(1000*log(2)/log(10)) ,或者只是动态添加它们。

    扰流板警告:




    typedef std::vector<char> bignum;
    
    void Double(bignum & num)
    {
        int carry = 0;
        for (bignum::iterator p = num.begin();  p != num.end();  ++p)
        {
            *p *= 2;
            *p += carry;
            carry = (*p >= 10);
            *p -= carry * 10;
        }
        if (carry != 0)
            num.push_back(carry);
    }
    
    void Display(bignum & num)
    {
        for (bignum::reverse_iterator p = num.rbegin();  p != num.rend();  ++p)
            std::cout << static_cast<int>(*p);
    }
    
    int main(int argc, char* argv[])
    {
        bignum num;
        num.push_back(1);
        for (int i = 0;  i < 1000;  ++i)
            Double(num);
        Display(num);
        std::cout << std::endl;
        return 0;
    }
    
        2
  •  3
  •   SLaks    16 年前

    你需要一个bignum库,比如 this one .

        3
  •  3
  •   AndersK    16 年前

    在C++中,你需要创建自己的BigItLIB,以便与Python做相同的操作。

        4
  •  2
  •   doron    16 年前

    double 它只有64位来存储1000位的数字。 有效数字使用51位,幅度使用11位。

    唯一的解决方案是要么使用其他地方提到的bignum库,要么推出自己的库。

        5
  •  2
  •   Nordic Mainframe    16 年前

    更新: 我刚刚浏览了Euler问题网站,发现问题13是关于大整数求和的。迭代方法在短时间内可能会变得非常棘手,因此我建议使用问题13中的代码来解决这个问题,因为 2**N => 2**(N-1) + 2**(N-1)

    使用bignums是欺骗,不是解决办法。另外,你不需要计算2**1000或者类似的东西来得到结果。我给你一个提示:

    0 1 2 4 8 16 32 64 128 256 ...
    

    现在为每个数字写下数字的总和:

    1 2 4 8 7 5 10 11 13 ...
    

    你应该注意到( x~=y 意味着x和y的数字总和相同)

    1+1=2, 1+(1+2)=4, 1+(1+2+4)=8, 1+(1+2+4+8)=16~=7 1+(1+2+4+8+7)=23~=5
    

    现在写一个循环。

    Project Euler=先思考再计算!

        6
  •  1
  •   Jerry Coffin    16 年前
        7
  •  0
  •   Zan Lynx    16 年前

    不是吗 pow(2, 1000)