Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
双精度C++;(或战俘(21000)) 我正在研究Euler项目,以弥补我的C++编程技巧,为下学期我们将要面临的编程挑战做好准备(因为他们不让我们使用Python,嘘!)_C++_Precision_Exponential - Fatal编程技术网

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

双精度C++;(或战俘(21000)) 我正在研究Euler项目,以弥补我的C++编程技巧,为下学期我们将要面临的编程挑战做好准备(因为他们不让我们使用Python,嘘!),c++,precision,exponential,C++,Precision,Exponential,我在16号,我正试图找到一种方法来保持2英寸的实际精度 例如: int main(){ double num = pow(2, 1000); printf("%.0f", num): return 0; } 印刷品 107150860718626732094842504906000181051405000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我在16号,我正试图找到一种方法来保持2英寸的实际精度

例如:

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

107150860718626732094842504906000181051405000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

缺少大多数数字(来自python):

>>2**1000

10715086071862673209484250490600011810514048117055360744375038837035112493612249319837881569558127594672917553146825871452856923140435984577469857485748033456748242309854210746056237114187541821530464749835819412673987675591655946077069145711964786867646604231652628672566803767676767676768686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686

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

sum(int(_) for _ in str(2**1000))
<>这给了我即时的结果,但是我正在尝试找到一种C++的方法。有什么建议吗?(哈哈…)

编辑:


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

你需要一个bignum库,比如。

你可能需要一个指针(双关语)


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

< P>如果你想在实际的基础上做这类事情,你就要寻找一个任意精确的算术包。周围有一个数字,包括、和


如果您只是想为Project Euler做点什么,您可以编写自己的代码来提升自己的能力。基本思想是将您的大量数据存储在相当多的小数据块中,并在这些数据块之间实现您自己的携带、借用等操作。

C/C++对基本数据类型进行操作。您正在使用一个只有64位的
双精度
来存储1000位的数字
double
使用51位表示有效数字,11位表示幅度


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

从本质上讲,pow(21000)不是只有两个左移1000次吗?它应该在双浮点中有一个精确的二进制表示。它不需要bignum库。

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

使用bignums是欺骗,而不是解决办法。此外,您不需要计算2**1000或类似的数值就可以得到结果。我给你一个提示:

取2**N的前几个值:

0 1 2 4 8 16 32 64 128 256 ...
现在记下每个数字的数字总和:

1 2 4 8 7 5 10 11 13 ...
您应该注意到(
x~=y
表示x和y具有相同的数字和)

现在写一个循环

Project Euler=在计算之前先思考!

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

剧透警报:看来我必须先显示代码,然后才会有人相信我。这是一个简单的bignum实现,有两个函数,Double和Display。我并不是为了简单而把它列为一门课的。数字以小尾数格式存储,最低有效位在前




typedef std::vector bignum;
无效双精度(bignum和num)
{
整数进位=0;
for(bignum::迭代器p=num.begin();p!=num.end();++p)
{
*p*=2;
*p+=进位;
进位=(*p>=10);
*p-=进位*10;
}
如果(进位!=0)
向后推(进位)的数量;
}
无效显示(bignum和num)
{
for(bignum::reverse_迭代器p=num.rbegin();p!=num.rend();++p)

std::cout是不是这些挑战的想法,你不应该只写2**1000?听起来对我来说不是挑战…Project Euler,还是ACM风格的挑战?@inf我发现Python倾向于让你在一些Project Euler问题上作弊。对于ACM,我知道你只允许使用很少的基本函数,而Project E我只是假设。问题不是给出所有的数字,而是给出数字的总和,也许另一种方法是正确的?那些编程挑战的想法不是要在精灵上提出相应的算法吗?第三方的东西没有满足我的需要-我编辑了我的问题以使其更清楚-但是编程竞赛倾向于称第三方库为作弊(除非我带来了死树版本并自己转录了代码…)是的,但2的幂通常可以用浮点数表示。打印的表示形式取决于标准库的实现。事实上,在linux上,OP程序给出的结果与Python程序的结果相同。2N的第一个值不应该是1,因为N0==1吗?对于13,我只是使用字符串流来读取一个字符串这个问题的唯一问题是,他们没有给我这个数字的字符串表示形式…你不需要整个库,你只需要一个函数来进行bigint加法或加倍,另一个函数来输出结果。如果你
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
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;
}