对于数字位数的判断及回文数的判断+Prime Palindromes

来源:互联网 发布:ubuntu登陆界面修改 编辑:程序博客网 时间:2024/04/30 08:59

一、判断数位:


int judgenum(int x)
{
 int c;
 c = 0;
 while(x>1)
 {
  x=x/10;
  c++;
 }
 return c;
}


许多人使用log的算法,即(由于math.h不支持lg,所以要用log(a)/log(b)的用法)log(a)/log(10)的方法,但这样有两个问题,

1.造成较大误差,计算机以二进制计算,log是根据泰勒级数进行展开的所以两个log一定会有误差。

2.log函数在调用math函数库的时候所进行的参数要求是double和float类型,int类型的整数并不支持。

所以暴力for的计算位数方法比较合适。


二、回文数的判断


int judgeword(int x)
{
 int sum =0;
 int temp = x;
 while(x)
 {
  sum = sum*10+x%10;
  x =x/10;
 }
 if(sum == temp)
 {
  return true;
 }
 else
  return false;
}


看不懂的可以用草稿纸进行一下计算。。


下面说说一道典型题:

Prime Palindromes

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 <= 1000,000,000); both a and b are considered to be within the range .

Input

Line 1: Two integers, a and b

Output

The list of palindromic primes in numerical order, one per line.

Sample Input
5 500
Sample Output
5711101131151181191313353373383

一开始使用最基本的算法:

#include<stdio.h>#include<math.h>#include<stdlib.h>#include<algorithm>#include<iostream>using namespace std;int judgeprime(int x){if(x ==1)return false;for(int i=2;i<= sqrt(double(x));i++){if(x%i == 0){return false;}}return 1;}int judgeword(int x){int sum =0;int temp = x;while(x){sum = sum*10+x%10;x =x/10;}if(sum == temp){return true;}elsereturn false;}int main(){int a,b;scanf("%d%d",&a,&b);for(int i =a;i<=b;i++){if(judgeprime(i)){if(judgeword(i)){printf("%d\n",i);}}}return 0;}



发现sample过了没问题,但是提交之后显示超时,显然是算法复杂度太高

后来修改了一下:
#include<stdio.h>#include<math.h>#include<stdlib.h>#include<algorithm>#include<iostream>using namespace std;int judgeprime(int x){if(x ==1)return false;for(int i=2;i<= sqrt(double(x));i++){if(x%i == 0){return false;}}return 1;}int main(){int a,b;int c,d,e,f;int g,y;scanf("%d%d",&f,&g);  for(a=5;a<=7;a++)  {  if((judgeprime(a)) && (a>=f) && (a<=g) )  {  printf("%d\n",a);  } }  for(a=1;a<=9;a+=2)  { y=11*a;  if((judgeprime(y)) && (y>=f) && (y<=g) )  printf("%d\n",y);  }  for(a=1;a<=9;a+=2)  {  for(b=0;b<=9;b++)  {  y= a*101+10*b;  if((judgeprime(y)) && (y>=f) && (y<=g) )  printf("%d\n",y);  }  }for(a=1;a<=9;a+=2)  {  for(b=0;b<=9;b++)  {for(c =0;c<=9;c++){  y=a*10001+1010*b+100*c;  if((judgeprime(y)) && (y>=f) && (y<=g) )  printf("%d\n",y);}  }  }for(a=1;a<=9;a+=2)  {  for(b=0;b<=9;b++)  {for(c =0;c<=9;c++){for(d =0;d<=9;d++){  y=a*1000001+100010*b+10100*c+1000*d;  if((judgeprime(y)) && (y>=f) && (y<=g) )  printf("%d\n",y);}}  }  }for(a=1;a<=9;a+=2)  {  for(b=0;b<=9;b++)  {for(c =0;c<=9;c++){for(d =0;d<=9;d++){for(e =0;e<=9;e++){  y=a*100000001+10000010*b+1000100*c+101000*d+10000*e;  if((judgeprime(y)) && (y>=f) && (y<=g) )  printf("%d\n",y);}}}  }  }    return 0; }


                                             
0 0