c语言 指定范围内的回文素数,题目如下,要求1S内完成的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 指定范围内的回文素数,题目如下,要求1S内完成的相关的知识,希望对你有一定的参考价值。

The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 100,000,000); both a and b are considered to be within the range .

参考技术A #include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
#pragma comment(lib,"Winmm.lib")
/*****************************************************************************************
我的处理器是Core i3 350M,2.26G,执行3.2亿次纯加法运算的时间为1s左右。
最耗时间的就是素数的判断,回文数的判断反倒很简单。我使用miller_rabin算法进行了对比,
miller_rabin在处理这些小的数上不具备优势,反而慢了近40%
为素数建立索引表不是个好选择,因为1到1亿之间的素数个数为576万多,会导致文件很大而且频繁地进行
查找也耗时的。如果用哈希表到可以稍微考虑考虑
发现1到1已之间的回文数的数量是极少的,只有5916个(除了能被2被3被5整除是数)。在判断是否为回文数
后判断素数,总共用时5500ms左右,其中判断素数所用的时间(找到回文数的时间为5000ms左右)只有10%左右。
所以问题得解,使用回文数的索引表。范围是5到1亿。
还有某些代码可以优化,在提高那么一点速度。
如果发现有地方有错误,请见谅。
****************************************************************************************/

//判断素数,稍有改建,miller_rabin算法在算1亿以内的数不如这个经典的算法快
bool IsPrime(long n)

long i=sqrt(n);
for(i;i>=7;i--)
if(n%i==0)

return false;


return true;


//回文数判断经典算法
bool IsPalindrome(long m)

long i, n;
i=m;
n=0;
while(i)

n=n*10+i%10;
i/=10;

return m==n; //返回true说明就是回文数了。


////////////////////////////////////////////////////
//*
long Arry[6000];//顺序表存储读取的回文数
int ptr;//指针

int main()

time_t start,finish,r;
long i;
long count=0;

FILE* fp;
if(!(fp=fopen("data.txt","r")))

printf("记录回文数的文件无法打开,请检查是否存在\n");
return 0;

ptr=0;
while(!feof(fp))

fscanf(fp,"%ld",Arry+ptr);
ptr++;

ptr-=1;//多弄出来1个记录
start=timeGetTime();
for(i=0;i<ptr;i++)

if(IsPrime(Arry[i]))
printf("%d ",Arry[i]);
count++;
if(count%8==0) printf("\n");


finish=timeGetTime();
r=finish-start;
printf("找到的符合要求的数的个数为:%d\n",count);
printf("用时:%d\n",r);
return 0;

//*

/*旧版本的主函数,先判断是否为回文数后判断是否为素数
int main()

time_t start,finish,r;
long i;
long count=0;
//if(miller_rabin(99999989,6))
// printf("Y\n");
//return 0;
start=timeGetTime();
for(i=5;i<=100000000;i+=2)

if(i%3==0) continue;
if(i%5==0) continue;
if(IsPalindrome(i))
//if(IsPrime(i))
//printf("%d ",i);
count++;
//


finish=timeGetTime();
r=finish-start;
printf("找到的符合要求的数的个数为:%d\n",count);
printf("用时:%dms\n",r);
return 0;

//*/

/*使用它建立记录回文数的文件,去除了能被2能被3能被5整除的数
int main()

FILE* fp;
fp=fopen("data.txt","w");
long i;
long count=0;
for(i=5;i<=100000000;i+=2)

if(i%3==0) continue;
if(i%5==0) continue;
if(IsPalindrome(i))
count++;
fprintf(fp,"%d ",i);
printf("进度:%d%%\r",i/1000000);



printf("文件建立完成!,写入的回文数个数为%d\n",count);

//*/追问

我们刚学习C语言,很多都没讲的很详细,就开始做这种比较难点儿的作业了、我有几个地方不太懂,
1.#include
#include
#include
#include
#include 这些开头引用的函数都是什么意思呢??、
2.布尔型变量输出true 和 false后如何承接到下面的函数呢?
3.判断质数的方法除了递除还有miller rabin就这两种方法么?我可以不可以用之前判断出的质数来进行检验呢?

追答

⊙﹏⊙b汗,。。。以后你学完C语言就都明白了。
1.前面是包含5个头文件,这些头文件里包含用到几个库函数的声明。
stdlib.h这个头文件例外,程序里没有一个库函数的声明在这里,调试的时候用了下,可以删除的。
stdio.h不多说,必备的
math.h求平方根sprt()函数声明所在文件
time.h time_t变量,一般的时间获取函数所在文件
Windows.h 获取较精确时间的函数timeGetTime()函数声明所在文件
2.bool IsPrime(long n) 这样的是函数定义,它后面的函数可以调用它。这里偷懒没写声明。
3.还有很多方法。你说的那个方法好像叫什么素数表发,也要先构建一个素数表。而且要判断的素数越大素数表包含的数据也就越多。你可以自己找找看看效果。那些方法在1亿个数字面前都会累积用掉相当大的时间。

本回答被提问者和网友采纳
参考技术B 作为一个ACMer是不允许填代码的,这点你也不是不知道的,希望楼主自己写下,不知道思路在问,所以……请加油!

ZZNUOJ_用C语言编写程序实现1607:回文素数(附完整源码)

题目描述

一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。
 
一个大于1的自然数,如果除了1和它本身外,不能被其他自然数整除,则称为素数。;
 
读入一个整数n,判断该整数是否既是素数又是回文数。若是,输出”Yes”,否则输出”No”。
 
要求分别使用函数IsPrime()来判定素数,使用IsPalindrome()来判定回文数。函数原型如下:
 
int IsPrime(int n);
 
int IsPalindrome(int n);
 
其他功能在main()函数中实现。

输入

输入一个正整数n。

输出

若n是回文素数,则输出”Yes”,否则输出”No”。

样例输入

383

样例输出

Yes

完整源码:

以上是关于c语言 指定范围内的回文素数,题目如下,要求1S内完成的的主要内容,如果未能解决你的问题,请参考以下文章

c语言练习36——输出一定范围内的素数

ACM_回文素数

C语言问题 【函数与过程】回文素数

求指定整数范围内的素数之和

ZZNUOJ_用C语言编写程序实现1607:回文素数(附完整源码)

ZZNUOJ_用C语言编写程序实现1607:回文素数(附完整源码)