如何提高c语言判断回文素数效率?

要求打出3~1000000000范围的回文素数,并显示用时,且在30秒内.我的严重超时,请高手指点~我自己的程序如下:#include<stdio.h>#include<... 要求打出3~1000000000范围的回文素数,并显示用时,且在30秒内.我的严重超时,请高手指点~我自己的程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
/*判断是否回文*/

int hw(int num)
{
int n=0;
int count=0;
count=num;

do
{
n*=10;
n+=num%10;
num/=10;

}
while (num>0);

if (count==n)
{
return 1;
}
else
{
return 0;

}

}

/*判断是否素数*/
int ss(int num)
{
int i,k,flag;
k=(int)sqrt(num);
for (i=3;i<=k;i+=2)
{
if (num%i!=0)
{
continue;
}
else
{
flag=0;
break;
}
}
if (i==(k+1))
flag=1;
return flag;

}

int main()
{
int start=3,end=1000000000,b;
int s,e;
s=time(NULL);

for (b=start;b<=end;b=b+2)
{

if (hw(b))
{
if (ss(b))
{
printf("%d\n",b);
}
}

}
e=time(NULL);
printf(" %d seconds",e-s);
return 0;
}
或是构造输出3~1e9的回文素数也可
展开
 我来答
百度网友7483f44
2007-11-11 · TA获得超过1195个赞
知道小有建树答主
回答量:662
采纳率:0%
帮助的人:1019万
展开全部
0.210秒,用Miller-Ribin检验素数
在oj上是15ms
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>

int a, b;

int mpow( int s, int t, int m )
{
long long f, p;
if ( t == 0 )
    return 1;
f = mpow( s, t >> 1, m );
if ( t & 1 )
{
    p = s * f * f;
    return p % m;
}
p = f * f;
return p % m;
}

int Miller_Ribin( int s )
{
int i, p;
for ( i = 0; i < 3; i++ )
{
    p = rand()% ( s - 2 ) + 2;
    if ( mpow( p, s - 1, s ) != 1 )
     break;
}
return i == 3;
}

void work( int c )
{
int p = ( c - 1 ) >> 1, i, j, s = 1, r, t1, t2;
if ( c == 1 )
{
    if ( a <= 3 && b >= 3 )
     printf("3\n");
    if ( a <= 5 && b >= 5 )
     printf("5\n");
    if ( a <= 7 && b >= 7 )
     printf("7\n");
    return ;
}
for ( i = 0; i < p; i++ )
    s *= 10;
for ( i = 1; i < 10; i += 2 )
{
    for ( j = 0; j < s; j++ )
    {
     r = i * s + j;
     t1 = j / 10;
     t2 = p - 1;
     while ( t2 )
     {
        r = r * 10 + ( t1 % 10 );
        t1 /= 10;
        t2--;
     }
     r = r * 10 + i;
     if ( r < a )
        continue;
     if ( r > b )
        return ;
     if ( Miller_Ribin( r ) )
        printf("%d\n", r);
    }
}
}

int main( )
{
int s, e;
srand( time( NULL ) );
int i, p, c;
// scanf("%d%d", &a, &b);
a = 3; b = 1000000000;
p = 1;
c = 0;
while ( p < a )
{
    c++;
    p *= 10;
}
p /= 10;
while ( p < b )
{
    if ( c == 2 )
     printf("11\n");
    if ( c & 1 )
     work( c );
    c++;
    p *= 10;
}
printf("force program runs %.3lfs\n", clock( ) / (double)

CLK_TCK);
return 0;
}
WXD110114dccd8
2007-11-11 · TA获得超过2.9万个赞
知道大有可为答主
回答量:1.6万
采纳率:43%
帮助的人:7872万
展开全部
时间仓促,写了一个代码,在P42.0G/512M/WIN2003/BCB2007的环境中用时50s

算法描述:开头是2,4,5,6,8的数字可以直接略过不予考虑,这样可以节省时间,先找回文数,然后再找素数。

程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#define N 1000
long x=3;
int tc(long int *s)
{

int i;
for (i=0; i <N ; i++) s[i]=x++;

return 1;

}
int zs(long int s)
{
long int sq,j;

sq=sqrt(s);
for (j=2; j<=sq; j++) {
if (s%j==0) {
return 0;
}
}
return 1;
}
void h(long int *s)
{
int i,j,len,len2;
char a[10];
for (i = 0; i<N; i++) {
sprintf(a,"%d",s[i]);

len=strlen(a);

len2=len/2;
for (j=0; j<len2; j++)
if (a[j]!=a[len-j-1]) {
s[i]=0;
break;
}

}

}
void z(long int *s)
{
int i;
long int sq,j;
for (i = 0; i<N; i++) {
if (s[i]!=0){
sq=sqrt(s[i]);
for (j=2; j<=sq; j++)
if (s[i]%j==0) {
s[i]=0;
break;
}

}

}
}
void p(long int *s)
{
int i;
int count=1;
for (i = 0; i<N; i++) {
if (s[i]!=0) {
printf("%ld",s[i]);
putchar(++count%10==0?'\n':' ');
}

}
}
void main()
{
time_t l_time;
long int l,l1;
long int s[N];
char a[10];

l_time=time(0);

for (l=1; l <= 100000; l++) {

if (x>9) {
sprintf(a,"%d",x+100);
l1=a[0]-48;
if (l1%2==0||l1%5==0) {x+=1000;continue;}
}

tc(s);

h(s);
z(s);
p(s);

}
l_time=time(0)-l_time;
printf("\n\n%ld sec.\n",l_time);
system("pause");

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友25ca792b2
2007-11-11 · TA获得超过1640个赞
知道小有建树答主
回答量:1337
采纳率:0%
帮助的人:1399万
展开全部
其他的先不说
int start=3,end=1000000000,b;
for (b=start;b<=end;b=b+2)

整型能表示1000000000这么大的数吗

一共就能放65536个
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pengxuan321
2007-11-11 · TA获得超过406个赞
知道小有建树答主
回答量:137
采纳率:0%
帮助的人:0
展开全部
32位字长的机器int型能取到2147483647,所以这个题用int 是没有问题的。

在回文的生成了,优化下代码~!

晕,有点问题了~!

期待高手的解决:我的也跑了N久才
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bearyxy
2007-11-11 · TA获得超过363个赞
知道小有建树答主
回答量:216
采纳率:0%
帮助的人:131万
展开全部
用long吧,4294967296的最大值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式