c语言回文素数对
Ⅰ 用c语言求1000以内的回文素数,程序哪错了运行不出结果。。
#include<stdio.h>
#include<stdlib.h>
intmain()
{
inti,a,b,c,g;
intgrate(ints);
for(i=1;i<1000;i++)
{
容for(a=i,b=0;a;a/=10)
{
b=b*10+a%10;
}
g=grate(i);
if(g==1&&i==b)
{
printf("回文素数为%d ",i);
}
}
return0;
}
intgrate(ints)
{
intj;
intflag=1;
if(s<2)
{
return0;
}
for(j=2;j<=s/2;j++)
{
if(s%j==0)
{
flag=0;
break;
}
}
returnflag;
}
Ⅱ C语言问题(回文素数)
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
bool prime(int n){
int i;
if(n<2) return false;
if(n==2 || n==3) return true;
if(!(n%2)) return false;
for(i=3; i*i<=n;i+=2)
if(!(n%i)) return false;
return true;
}
bool palindrome(int n){
char a[5]="",b[5]="";
itoa(n,a,10);
if(!strcmp(a,strrev(strcpy(b,a))))
return true;
return false;
}
void main(void){
int i,ln;
printf("%5d",2);
for(ln=1,i=3;i<10000;i+=2)
if(prime(i) && palindrome(i))
printf(++ln%5 ? "%5d" : "%5d\n",i);
printf("\n");
}
Ⅲ c语言编程:输出m~n之间的回文素数
程序开始部分没什么问题,结尾一个接一个
是自己想乱了还是着急了?
如果刚学C 最好还是先列个流程 然后再写,不容易出错
改正后的程序如下,原因见注释
#include<stdio.h>
intmain()
{
intm,n,c,b,k,p,q,r,leap;
scanf("%d%d",&m,&n);
r=0;
leap=0;
for(k=m;k>=m&&k<=n;k++)
{
b=0;
p=k;
while(k>0)
{
c=k%10;
b=b*10+c;
k=k/10;
}
if(b==p)
{
for(q=2;q<p;q++)
if(p%q==0)
break;
if(q==p)
{
leap=1;
r=r+1;
}
else
leap=0;
}
else
leap=0;
k=p;//恢复k的值,下次循环用用的
//输出语句移到循环内,对每个回文素数做输出
if(leap==1)//==判断
{//只有本身为回文素数时,判断是否需要输出换行
printf("%d",p);
if(r%5==0)//一次判断不然死循环输出换行了
printf(" ");
}
}
return0;
}
Ⅳ C语言改错回文素数
这个程序没有错:
#include<stdio.h>
main()
{
int i,j,t,k,s;
printf("following are palindrome primes not greater than 1000: ");
for(i=0;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
{
s=i*100+j*10+k;
t=k*100+j*10+i;
if(i==0&&j==0)t/=100;
else if(i==0) t/=10;
if(s>10&&s==t && a(s))
printf("%d ",s);
}
}
a(n)
int n;
{
int i;
for(i=2;i<=(n-1)/2;i++)
if(n%i==0)return(0);
return(1);
}
Ⅳ C语言问题 【函数与过程】回文素数
【题目】:
题目:如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如6886就是一个回文数,从给出的数据中统计出既是回文数又是素数的数(<109)。
【思路分析】:
首先,你输入的是整数(x),计算机不能像人脑一样直接得到每个数位(数组a[10])。
所以,要先判断数位(n),然后只要数位数组中a[i]=a[n-i]即可。
关于素数,设置一个for循环,只要从1到x都不存在能整除x的数,就是素数了。
【代码如下】:
#include <stdio.h>
#include<windows.h>
int main()
{
int
a[1000];
int
n;//输入整数的个数
printf("请输入整数的个数:\n");
scanf("%d",&n);
int
i;
printf("请输入这%d个整数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int
result_1;//值为1表示是回文数,值为0表示不是。
int
result_2;//值为1表示是质数,值为0表示不是。
int
palindrome(int y);//判断回文数的函数
int
prime(int y);//判断质数的函数
int
y;//y是要代入函数里的参数
int
num=0;//num用来计总共有几个符合条件的数
int
b[1000];//b[1000]是符合要求的数组
for(i=0;i<n;i++)
{
result_1=0;//先使初值=0。
result_2=0;
y=a[i];
result_1=palindrome(y);
result_2=prime(y);
if((result_1==1)&&(result_2==1))
{
b[num]=a[i];
num++;
}
}
if(num>0)
{
printf("总共有%d个既是回文数又是质数的数:\n",num);
for(i=0;i<num;i++)
printf("
%d",b[i]);
printf("\n");
}
else
printf("输入的整数均不符合要求\n");
system("pause");
return 0;
}
int palindrome(int y)
{
int
a[10];//a[10]表示y的各个数位的值
int
i=0;
while(y>=1)
{
a[i]=y%10;//y%10就得到y的末位
y=y/10;//让倒数第二位变成了末位
i++;//i最后又自加了一次,所以i就表示y有多少位
}
int
j;
int
z=1;
for(j=0;j<=(i-1)/2;j++)
{
if(a[j]!=a[(i-1)-j])
{
z=0;
break;
}
else
continue;
}
return
(z);
}
int prime(int y)
{
int
i,z;
z=1;
for
(i=2;i<y;i++)
{
if(y%i==0)
{
z=0;
break;
}
else
continue;
}
return(z);
}
【测试数据】:
n = 168
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53
59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163
167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271
277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397
401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521
523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647
653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787
797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929
937 941 947 953 967 971 977 983 991 997
【测试结果】:
请输入整数的个数:
168
请输入这168个整数:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53
59 61 67 71 73 79 83 89 97 101 103 1
07 109 113 127 131 137 139 149 151 157 163
167 173 179 181 191 193 197 199 211 2
23 227 229 233 239 241 251 257 263 269 271
277 281 283 293 307 311 313 317 331 3
37 347 349 353 359 367 373 379 383 389 397
401 409 419 421 431 433 439 443 449 4
57 461 463 467 479 487 491 499 503 509 521
523 541 547 557 563 569 571 577 587 5
93 599 601 607 613 617 619 631 641 643 647
653 659 661 673 677 683 691 701 709 7
19 727 733 739 743 751 757 761 769 773 787
797 809 811 821 823 827 829 839 853 8
57 859 863 877 881 883 887 907 911 919 929
937 941 947 953 967 971 977 983 991 9
97
总共有20个既是回文数又是质数的数:
2 3
5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929
请按任意键继续. . .
Ⅵ c语言 指定范围内的回文素数,题目如下,要求1S内完成的
#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语言输入一个数n,输出n以内所有的回文素数.回文素数,即是素数,又是回文数
#include"stdio.h"
void huiwen(int n){
int i=1,bo=1;
int num1=n,num2=n;
while(num1>=10){
num1%=10;i++;
}
int *a=new int[i];
i=0;
while(num2>0){
a[i++]=num2%10;
num2/=10;
}
答for(int j=0;j<i/2;j++){
if(a[j]!=a[i-1-j]){
bo=0;break;
}
}
if(bo)
printf(" %d" ,n);
}
void prime(int n){
int bo;
for(int i=2;i<=n;i++){
bo=1;
for(int j=2;j*j<=i;j++){
if(i%j==0){
bo=0;
break;
}
}
if(bo){
huiwen(i);
}
}
}
void main(){
int n;
printf("输入一个数\n");
scanf("%d",&n);
printf("回文素数有:");
prime(n);
printf("\n");
}
Ⅷ 如何提高c语言判断回文素数效率
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;
}