如何让我的程序更快地运行?

时间:2016-11-06 08:20:24

标签: c++ c algorithm optimization

我尝试运行此代码,但在少数情况下显示超出时间限制,如何缩短时间?

我需要了解我在我的程序中使用了多长时间,比如某些函数等。我通过改进迭代和复杂性来理解我可以减少执行时间,但它没有多大帮助。请帮助

程序很简单,我拿点a和点b并计算所有回文数的数字。

my execution time is just exceeding by .0015 seconds!

#include<stdio.h>
int ifpalin(int g)
{
    int rev=0;
    int tmp=g;
    while(tmp>0)
    {
        rev=rev*10+(tmp%10);
        tmp=tmp/10;
    }
    if(rev==g)
        return 1;
    else
        return 0;
}
int findpalin(int a1,int b1)
{
    int sm=0;
    for(int i=a1;i<=b1;i++)
    {
      if  (ifpalin(i)==1)
        sm++;
    }
    printf("%d",sm);
    printf("\n");
    return 0;
}
int main()
{
int a,b,n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a);
        scanf("%d",&b);
        findpalin(a,b);
    }
    return 0;
}

3 个答案:

答案 0 :(得分:3)

您的代码已经非常高效(作为算法的实现,这是可以改进的)。这些挑战希望您找到一种“非显而易见”但更有效的算法。即,在这种特殊情况下,您不应该检查ab之间的每个数字。

这里有另一种解决方案,即你可以直接“知道”palidromes的数量。想想它就像这样:

有一位数,有10个palidromes [0, ..., 9]

有两位数,有9个回文[11, ..., 99]

有三个数字,有9种可能,第一个和最后一个数字相等[1, ..., 9]。对于可行的回文,中间也必须是回文。由于中间有一位数,我们知道这里有十种可能的回文,因此我们有9 * 10 = 90个3位数的回文。

有四位数字,我们得到9 * 10(两位数的回文,现在也允许00)和5位9 * 100(3位p,从0开始)。

因此,您可以导出n位数字的公式。 然后,您可以直接导出a和b之间的大条纹的数字,并且只需担心哪个数字相关,以及由于a和b不是10^(n-1)而在开头和结尾丢失了多少个数字和10^n - 1

答案 1 :(得分:0)

对于每个给定的g,您的int ifpalin(int g)函数可以并行运行,因为它似乎是此函数的不同输入数据,对其他数据没有影响。你可以并行运行这个功能。

int findpalin(int a1,int b1)函数中,有一个for循环,其复杂性顺序为N,这是您可以运行线程的地方。 (每个线程,运行函数ifpalin)。当然,需要一个良好的并行计划。 您可以在一些逻辑串中运行此函数,并聚合结果。

另一方面,任何基准都应该在发布模式下执行。

我希望它有所帮助。

打扰一下,如果我的英文写作不好,请纠正我

答案 2 :(得分:-1)

In ifpalin
Convert the number to string 
Reverse the string
Compare with the original
If equal then it's a palindrome

请参阅How to reverse an std::string?