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亿个数字面前都会累积用掉相当大的时间。
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内完成的的主要内容,如果未能解决你的问题,请参考以下文章