C++ Sierpinski三角形的周长

C++ Sierpinski三角形的周长,c++,c++11,math,c++14,C++,C++11,Math,C++14,我目前正在为自己的实践做准备。我设法通过了所有的测试用例,所以我不知道出了什么问题。我的代码是: #include <iomanip> #include <iostream> #include <vector> #include <string> #include <cmath> using namespace std; int main(){ int num = 1; while(true){ string li

我目前正在为自己的实践做准备。我设法通过了所有的测试用例,所以我不知道出了什么问题。我的代码是:

#include <iomanip>
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
int main(){
   int num = 1;

   while(true){
    string line,stringRes;
    getline(cin,line);
    if(cin.eof()){break;}
    long double shrinks = atof(line.c_str());

    long double triangels = pow(3,shrinks);
    long double length = 3/pow(2,shrinks);
    long double res = floor(triangels* length * 3);
    int i = 0;
    while(res >= 10){
        i++;
        res =  res/10;
    };
    if(shrinks == 1){
        printf("Case %d: %d\n",num ,1);
    }else{
        printf("Case %d: %d\n",num ,i+1);
    }
    num++;
}
return 0;
}
输出样本

Case 1: 1
Case 2: 1
Case 3: 2
Case 4: 3
Case 5: 19

对于每种情况,显示案例编号,后跟表示给定迭代次数周长整数部分所需的小数位数。按照示例输出的格式操作。

您正在溢出三角形的值。当你有

long double triangels = pow(3,shrinks);
其中收缩=10000给出:1.6313501853426258743032567291812e+4771

sizeoflong double==8时长双精度的范围为1.7E+/-308


您很可能需要使用来解决此问题。

您正在溢出三角形的值。当你有

long double triangels = pow(3,shrinks);
其中收缩=10000给出:1.6313501853426258743032567291812e+4771

sizeoflong double==8时长双精度的范围为1.7E+/-308


很可能您需要使用来解决此问题。

如前所述,您得到错误结果的原因是:使用pow会导致溢出,但也因为您(正如您似乎已经意识到的那样)使用3作为起始边长

下面是一个替代的、正确的解决方案,它稍微短一点,没有溢出:

阶数n>=0的Sierpinski三角形的周长或周长Pn可以显示为:

P(n) = 3^(n + 1) / 2^n
我没有提供证据,因为没有必要解决这个问题。然而,很容易理解的是,一定是这样。一种方法是通过计算Sierpinski三角形前几个阶的周长:3、9/2、27/4、81/8,…,另一种方法是考虑当1将形状收缩½倍,2将三角形延伸3倍时周长如何变化

以10 x为基数的任意自然数中的位数Dx为:

因此,为了计算n阶Sierpinski周长中的小数位数,我们计算Pn=3^n+1/2^n的整数部分的位数,即DfloorPn,这也是问题的解决方案:

D(floor(P(n))) = 1 + floor(log10(3^(n + 1) / 2^n)) = /log(a/b) = log(a) - log(b)/ =
= 1 + floor(log10(3^(n + 1)) - log10(2^n)) = /log10(a^b) = b * log10(a)/ =
= 1 + floor((n + 1) * log10(3) - n * log10(2))
解决此问题的C++实现:


您得到错误结果的原因是,如前所述:您使用pow获得溢出,但也因为您——正如您似乎已经意识到的那样——使用3作为起始边长

下面是一个替代的、正确的解决方案,它稍微短一点,没有溢出:

阶数n>=0的Sierpinski三角形的周长或周长Pn可以显示为:

P(n) = 3^(n + 1) / 2^n
我没有提供证据,因为没有必要解决这个问题。然而,很容易理解的是,一定是这样。一种方法是通过计算Sierpinski三角形前几个阶的周长:3、9/2、27/4、81/8,…,另一种方法是考虑当1将形状收缩½倍,2将三角形延伸3倍时周长如何变化

以10 x为基数的任意自然数中的位数Dx为:

因此,为了计算n阶Sierpinski周长中的小数位数,我们计算Pn=3^n+1/2^n的整数部分的位数,即DfloorPn,这也是问题的解决方案:

D(floor(P(n))) = 1 + floor(log10(3^(n + 1) / 2^n)) = /log(a/b) = log(a) - log(b)/ =
= 1 + floor(log10(3^(n + 1)) - log10(2^n)) = /log10(a^b) = b * log10(a)/ =
= 1 + floor((n + 1) * log10(3) - n * log10(2))
解决此问题的C++实现:



请在标题中只使用英文字母。你能添加关于预期输出和实际输出的详细信息吗?我只是使用问题的名称。我链接了这个问题,但我会添加测试样本。请在标题中只使用英文字母。你能添加关于预期输出和实际输出的详细信息吗?我只是使用问题的名称。我链接了这个问题,但我会添加测试样本。你有关于如何使用它的指南吗?我个人没有,但快速的谷歌搜索给出了这样一个问题,看起来不错:我不明白为什么输入样本为1时输出样本为1。因为在第1阶段,它的9+1,5*3是13.5,所以整数部分是2。@user3664730在迭代0中,我们的周长是3,因为我们有3个1单位边。在迭代1中,我们去掉了中心三角形,它给出了3个边为.5的三角形,所以我们有3*3*.5或4.5,可以用1个整数来表示。这就解决了问题!我读课文时好像每边都是3而不是1。谢谢你的帮助!你有关于如何使用它的指南吗?我个人没有,但是快速的谷歌搜索给出了一个很好的问题:我不明白为什么输入样本为1时输出样本为1。因为在第1阶段,它的9+1,5*3是13.5,所以整数部分是2。@user3664730在迭代0中,我们的周长是3,因为我们有3个1单位边。在迭代1中,我们去掉了中心三角形,它给出了3个边为.5的三角形,所以我们有3*3*.5或4.5,可以用1个整数来表示。这就解决了问题!我读课文时好像每边都是3而不是1。谢谢你的帮助!尽管这个问题才半年多
答案很好。特别是考虑到你先从数学上简化了这个问题。最后,我有一点建议:对log10值使用静态常量。然后可以进一步简化表达式:n*log10_3-log10_2+log10_3。将log10_3-log10_2保存到另一个常量并去掉log10_2将进一步改进它!非常感谢。这绝对是一种正确的、可供选择的表达方式-尽管这个问题才提出了半年多,但答案是令人钦佩的。特别是考虑到你先从数学上简化了这个问题。最后,我有一点建议:对log10值使用静态常量。然后可以进一步简化表达式:n*log10_3-log10_2+log10_3。将log10_3-log10_2保存到另一个常量并去掉log10_2将进一步改进它!非常感谢。这绝对是一种正确的、可供选择的表达方式-