循环素数,帮助发现错误,C++
Circular prime, help finding the mistake, C++
花费和小时试图找到错误,没有成功:(
解决欧拉问题:http://projecteuler.net/problem=35
看来我的头现在不工作了
代码没有优化,对此感到抱歉(我在这里做错了什么?正确答案是 55,我的程序给了我 22
#include "euler.hpp"
#include <algorithm>
int main() {
euler::prime_generator<euler::eratosthenes_sieve> gen;
gen.range(0, 1000000);
unsigned c = 0; // number of circular primes
unsigned p = 0; // number of primes (test)
unsigned prime;
while(prime = gen.nextPrime()) {
p++;
bool ok = true;
std::vector<unsigned> pv = euler::number2vector(prime);
if(pv.size() > 1) {
bool cont = false;
for(unsigned i = 0; i < pv.size(); ++i) {
if(pv[i] % 2 == 0) { cont = true; break; }
}
if(cont) continue;
std::sort(pv.begin(), pv.end());
do {
if(!gen.isPrime(euler::array2number(&pv[0], pv.size()))) {
// was desperate and made this
if(euler::isPrime(euler::array2number(&pv[0], pv.size()))) {
std::cout << prime << " -> " << euler::array2number(&pv[0], pv.size()) << std::endl;
}
else ok = false;
break;
}
} while(std::next_permutation(pv.begin(), pv.end()));
}
if(ok) {
//std::cout << prime << std::endl;
c++;
}
//std::cout << prime << std::endl;
}
std::cout << p << " -> " << c << std::endl;
euler::pause();
}
我使用的几个外部函数
// in class
void range(unsigned lower_bound, unsigned upper_bound) {
m_lower_bound = lower_bound;
primes.resize(upper_bound - lower_bound + 1, true);
for(unsigned i = 0; i < 2 - lower_bound; ++i) primes[i] = false;
for(unsigned i = 2; i <= sqrt(upper_bound - lower_bound); ++i) {
if(primes[i]) {
for(unsigned j = i*i; j <= upper_bound; j += i) {
primes[j] = false;
}
}
}
}
// in the same class
bool isPrime(unsigned number) {
return primes[number - m_lower_bound];
}
// in the same class
unsigned nextPrime() {
for(; next <= m_upper_bound; ++next) {
if(isPrime(next)) return next++ + m_lower_bound;
}
return 0;
}
template <typename T>
T array2number(T * begin, unsigned length) {
T number = 0;
unsigned m = 1;
while(length--) {
number += begin[length] * m;
m *= 10;
}
return number;
}
template <typename T>
std::vector<T> number2vector(T number) {
unsigned l = number_length(number);
std::vector<T> vec(l);
while(l--) {
vec[l] = number % 10;
number /= 10;
}
return vec;
}
提前谢谢你!
这个问题在SO上已经解决了很多次。 搜索"[c++] 素数欧拉"。
证据由for
循环的终止条件给出:
sqrt(upper_bound - lower_bound)
我在您的帖子中找不到primes[]
的定义。 range
函数访问它,但它不是通过参数提供的,也不是在函数中声明的primes
数组。
您可以通过搜索SO和网络来获得大量信息。 在发布之前尝试一下。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'