C++ 我如何计算不带';不适合无符号长?C++;

C++ 我如何计算不带';不适合无符号长?C++;,c++,C++,我已经创建了一个程序,它汇总给定数据的所有可能的子字符串。例如: 12应该返回30,因为 1 1 + 1 1 + 1 + 2 1 + 1 + 2 + 2 1 1 + 2 1 + 2 + 2 2 2 + 2 2 总结到30,现在的问题不是创建这样一个程序,问题是当大的(10^15)数字出现时,可能会有多达10^5个。现在我的问题是:我如何处理这些数字?我只能使用标准库,所以不幸的是我没有GMP,而且我还被迫在GCC 4.4.4上运行,这使得情况更糟。我认为对UINT_128进行简单的实现(只有您

我已经创建了一个程序,它汇总给定数据的所有可能的子字符串。例如: 12应该返回30,因为

1
1 + 1
1 + 1 + 2
1 + 1 + 2 + 2
1
1 + 2
1 + 2 + 2
2
2 + 2
2

总结到30,现在的问题不是创建这样一个程序,问题是当大的(10^15)数字出现时,可能会有多达10^5个。现在我的问题是:我如何处理这些数字?我只能使用标准库,所以不幸的是我没有GMP,而且我还被迫在GCC 4.4.4上运行,这使得情况更糟。

我认为对UINT_128进行简单的实现(只有您需要的)是非常容易的。(您的最大答案实际上符合uint_96)

假设我知道您将要实现该程序的方式,那么您所需要的只是采用uint64的构造函数;加法算子;乘法算子;还可能是一次展示

我会在内部将其存储为4 uint32_t(单词),操作可以通过对单词进行操作来实现,就像手动对小数进行加法或长乘法一样。乘法可以简化,因为我相信你的因子永远不会超过uint64,所以你可以利用它


如果您需要显示除二进制或十六进制以外的内容,则可能还需要实现除法(或者如果您非常懒惰,则可以使用逐位二进制搜索方式进行猜测和检查,仅使用乘法来获得十进制表示).

对于任何对答案感兴趣的人,我只需将溢出数移动到无符号long-long-int中就可以找到答案

for(int i = 1; i <= n; i++){                        
        SUM += addends[i - 1] * (i * (n - i + 1));

    if(SUM > 10000000000000000000){     // If close to overflow of unsigned long long int
        SUM -= 10000000000000000000;    // Remove 10^17
        counter ++;                     // And boost counter, to make recreating true value possible
    }
}
for(int i=1;i 100000000000000000){//如果接近无符号长int的溢出
总和-=100000000000000000;//删除10^17
计数器+++;//和boost计数器,使重新创建真值成为可能
}
}

可能真的没有效果,但对我来说已经足够好了。谢谢大家的帮助

你需要至少大致分析一下你的结果会有多大。例如,如果它是GooooL的顺序,那么所谓的“大整数”将无济于事。我建议使用GMP,因为它不是标准C++库的一部分。解决了“我只能使用标准库”的问题,而不是解决“我只有64位整数可用”的问题。