【问题标题】:Project Euler:#14 Integer overflow and Stack overflowProject Euler:#14 整数溢出和堆栈溢出
【发布时间】:2011-07-20 10:55:43
【问题描述】:
unsigned long long terms;
unsigned long long test;
unsigned long long digit = 1;
unsigned long long max = 0;

//cout<<sizeof(long)<<" "<<sizeof(int)<<endl;
//cout<<digit<<endl;
for(;digit<1000000;++digit)
{
    terms = 1;
    test = digit;
    while(test>1)
    {
        if(0==(test%2))
        {
            test /=2;
        }else{
            test = test *3 +1;
        }
        terms ++;
    }   
    if(terms>max)
        max = terms;
}
//terms = get_chain_length();

/*if(terms>max)
        max = terms;*/
//cout<<sizeof(long long)<<endl;
cout<<max<<endl;

超出 INT_MAX,我该如何纠正?我尝试以递归方式使用 Hash_map,但堆栈了。

【问题讨论】:

  • 虽然这个问题是众所周知的,但对于每个在 Project Euler 上浪费时间的人来说,这似乎是一个剧透解决方案!

标签: c++


【解决方案1】:

这是Collatz Conjecture。考虑使用memoization 通过存储您看到的链的长度来解决问题(例如,如果 6 给出的链长度为 7,而您在处理更改 N 时遇到 6,那么您只需将链长度加 7到目前为止并立即返回)。

【讨论】:

  • 我曾经在处理 0 到 1,000,000 之间时使用缓冲区来存储之前得到的结果,但是发生了堆栈溢出。
  • 也许将该代码添加到票证中?有关示例解决方案,请参阅相关票证stackoverflow.com/questions/2643260/…
猜你喜欢
  • 2010-09-27
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 2012-12-20
  • 2011-03-02
  • 2011-08-22
相关资源
最近更新 更多