微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 和 C++ 中的程序之间的差异

如何解决Python 和 C++ 中的程序之间的差异

我用 C++ 编写了一段代码解决 Project Euler 上的一个编程挑战(问题 65:https://projecteuler.net/problem=65),但一直没有得到正确的答案。为了检查我的算法,我用 Python 编写了“相同”的代码(据我所知是相同的,但显然有一些不同),但我得到了不同的答案(正确答案)。

该程序背后的基本思想是找到 e 的连分数的第 100 次收敛的分子中的数字之和。将连续分数表示为“e = [2;1,2,1,4,6,...,2k,...]”——这是向量e_terms 我填写我的代码

我的问题是为什么我的 C++ 代码给出的答案与 Python 不同? (同样,我已经知道挑战的答案,我只是想了解我的代码间的区别。)两个代码都给出了连分数的前 10 个近似值,直到第 45 个近似值;但是从 46 开始,我的代码给了我不同的值。是因为 long double 不像 Python 那样存储整数吗?还是我的 C++ 代码中存在某种缺陷?

在此先感谢您的帮助!如果我的代码有什么需要澄清的地方,请告诉我。

C++ 代码

#include <iostream>
#include <vector>
#include "math.h"
using namespace std;

void PrintDouble(long double num)
{
   int val = 0;
   for (int i = floor(log(num)/log(10)); i >= 0; i--)
   {
      val = floor(num/(pow(10,i)));
      num -= val*pow(10,i);
      cout << val;
   }
}

void Convergents_e(int max_val)
{
   long double numer = 0,denom = 1,temp;
   vector<int> e_terms;

   if (max_val > 1) e_terms.push_back(1);
   if (max_val > 2) e_terms.push_back(2);
   if (max_val > 3)
   {
      for (int i = 1; i <= max_val-3; i++)
      {
         if (i%3 == 0) e_terms.push_back((int)((i/3+1)*2));
         else e_terms.push_back(1);
         cout << e_terms.back() << endl;
      }
   }

   for (vector<int>::reverse_iterator it = e_terms.rbegin(); it != e_terms.rend(); it++)
   {
      numer += ((double)(*it) * denom);
      cout << "\tnumer = ";
      PrintDouble(numer);
      cout << endl;
      swap(numer,denom);
   }
   numer += 2*denom; // +1 term

   cout << "e = " << numer << "/" << denom << " = " << numer/denom << endl;

   int val = 0,sum = 0;
   for (int i = floor(log(numer)/log(10)); i >= 0; i--)
   {
      val = floor(numer/(pow(10,i)));
      numer -= val*pow(10,i);
      sum += val;
      cout << val;
   }

   cout << endl << "The total of the digits is " << sum << endl << endl;
}

int main()
{
   Convergents_e(100);
}

Python 代码

#!/usr/bin/env python3
import math as m

max_val = 100

numer = 0
denom = 1
e_terms = []
digits = []

if (max_val > 1): e_terms.append(1)
if (max_val > 2): e_terms.append(2)
if (max_val > 3):
   for i in range(1,max_val-3 + 1):
      if (i%3 == 0): e_terms.append(int((i/3+1)*2))
      else: e_terms.append(1)
      print(e_terms[-1])

for e_t in reversed(e_terms):
   numer += e_t * denom
   print("\tnumer =",numer)
   numer,denom = denom,numer
numer += 2*denom # +1 term

print("e =",numer,"/",denom,"=",numer/denom)

val = 0
sum = 0
for i in reversed(range(0,m.ceil(m.log(numer)/m.log(10)))):
   val = m.floor(numer/(10**i))
   numer -= (val*(10**i))
   digits.append(val)
   sum += val
   #print(val)

print( "The total of the digits is",sum)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。