我尝试运行此代码,但在少数情况下显示超出时间限制,如何缩短时间?
我需要了解我在我的程序中使用了多长时间,比如某些函数等。我通过改进迭代和复杂性来理解我可以减少执行时间,但它没有多大帮助。请帮助
程序很简单,我拿点a和点b并计算所有回文数的数字。
#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;
}
答案 0 :(得分:3)
您的代码已经非常高效(作为算法的实现,这是可以改进的)。这些挑战希望您找到一种“非显而易见”但更有效的算法。即,在这种特殊情况下,您不应该检查a
和b
之间的每个数字。
这里有另一种解决方案,即你可以直接“知道”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