如何解决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 举报,一经查实,本站将立刻删除。