重要C++代码执行减速

重要C++代码执行减速,c++,performance,C++,Performance,所以我必须解决一个USACO的问题,涉及到计算所有的素数我想你已经做了反向。如果DFS实际上就是这样做的,那么生成所有可能的回文似乎很奇怪。。。这个函数使我困惑,然后检查它们中的哪个是素数。特别是因为你必须生成素数 另一件事是,您在iPrime中进行线性搜索,这并没有利用数组已排序的事实。改为使用二进制搜索 而且,在DFS函数中使用列表而不是向量会影响运行时。试着用一个小瓶子 现在,所有这些都表明,我认为你应该反过来做。有大量的回文不是素数。生成它们有什么意义?一个简单的堆栈就是检查一个数字是否

所以我必须解决一个USACO的问题,涉及到计算所有的素数我想你已经做了反向。如果DFS实际上就是这样做的,那么生成所有可能的回文似乎很奇怪。。。这个函数使我困惑,然后检查它们中的哪个是素数。特别是因为你必须生成素数

另一件事是,您在iPrime中进行线性搜索,这并没有利用数组已排序的事实。改为使用二进制搜索

而且,在DFS函数中使用列表而不是向量会影响运行时。试着用一个小瓶子

现在,所有这些都表明,我认为你应该反过来做。有大量的回文不是素数。生成它们有什么意义?一个简单的堆栈就是检查一个数字是否是回文的全部。像这样:

bool IsPalindrome( unsigned int val )
{
    int digits[10];
    int multiplier = 1;
    int *d = digits;

    // Add half of number's digits to a stack
    while( multiplier < val ) {
        *d++ = val % 10;
        val /= 10;
        multiplier *= 10;
    }

    // Adjust for odd-length palindrome
    if( val * 10 < multiplier ) --d;

    // Check remaining digits
    while( val != 0 ) {
        if(*(--d) != val % 10) return false;
        val /= 10;
    }

    return true;
}
还有一件事需要指出。实际上有两件事:

int MAXN = 100000000;
unsigned short bits[2000000] = {};
位太短,无法表示1亿个标志。 bits未初始化。 要解决这两个问题,请尝试:

unsigned short bits[1 + MAXN / 16] = { 0 };

对log10的调用不起任何作用,所以当您对const value和c调用它时,编译器会将其删除,但它不能将其全部删除[i]为什么会有这一行它返回一个值,然后您将丢弃该值。如果你想找到“c”中的位数,那么用1000/100/10/etc进行重复除法可能比用log10I进行测试要快得多。现在,当我用int d=log102来更改log102时,代码仍然会执行0.5秒,但是当我将它更改为int d=log10all[I]时,它会慢到1.7秒。好吧,我已经设法找到了一个非常快速的解决方案。你可以在这里看到。计算[11000]范围内的所有素数被证明是不够有效的,因为我有1秒的时间限制。顺便说一句,回文没有那么多,[1;100M]的回文数约为12K,因此生成回文并检查它是否为素数要比另一种方法好得多。你为什么说我应该使用二进制搜索?我不是在搜索一个特定的值,为了使算法正确,我必须迭代所有的素数。@user1113314,但您正在用筛子生成所有的素数。所以你关于只检查回文是否为素数来节省时间的评论是错误的。我建议使用二进制搜索,因为iPrime函数在有序数组中进行线性搜索。我不确定你是否特别理解我的答案。我认为您发布的代码就是您所说的运行速度几乎足够快的代码。但是你评论中的解决方案与这个解决方案完全不同。啊,是的,现在我明白了。因为我用的是筛子,所有的回文都是素数,也都是0。当我推这些素数时,它们包含回文。所以我的isPrime函数只需要进行二元搜索并检查回文是否在向量中。但实际上它可以在O1时间内完成,如果对于给定的palinframe N,我只需要检查ifgetBitN==0,那么它就是素数。谢谢你的澄清。
calcSieve();
for( vector<int>::iterator it = primes.begin(); it != primes.end(); it++ ) {
    if( IsPalindrome(*it) ) cout << *it << "\n";
}
int MAXN = 100000000;
unsigned short bits[2000000] = {};
unsigned short bits[1 + MAXN / 16] = { 0 };