加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

完全平方回文数--回文数个数--素数回文数

(2018-09-11 14:00:14)
分类: 函数,穷举
一)326.完全平方回文数
给定一个十进制自然数的范围和进制的范围,十进制自然数范围在1~44700之间,是m*m形成的平方数,进制的范围在2~36之间。给定范围里的数中,有些数的平方,在某进制下既是完全平方数,又是回文数。本题的任务是统计给定范围内有多少个数的平方满足下列条件;仅在某一进制下既是完全平方数又是回文数。
说明:3^2=9,因为它在十进制和十一进制中都是回文数,所以9不能算;同样,26^2=676也不算。
输入格式:一行四个整数,分别表示给定的十进制自然数m的范围和进制的范围。
输出格式:一行一个正整数,青示给定范围内满足条件的数的个数。
输入样例:
1 100 9 11
输出样例:
 12
样例说明:
6^2=36=33 base 11;
10^2=100=121 base 9;
11^2=121=121 base 10;
12^2=144=121 base 11
20^2=400=484 base 9;
22^2=484=484 base 10;
24^2=576=484 base 11;
72^2=5184=3993 base 11;
82^2=6724=10201 base 9;
84^2=7056=5335 base 11;
91^2=8281=12321 base 9;
100^2=10000=1464 base 9

using namespace std;
bool judge(int x,int k) {
    int top=0,s[100000];
    do{
        s[top++]=x % k;
        x/=k;//兼容不同进制
    }while (x!=0);
    //转成高精度形态。用数组装数字,以便判断是否回文数;
    for (int i=0;i
        if (s[i]!=s[top-i-1]) return false;
    return true;
}
 
int main() {
   int m1,m2,n1,n2;
   cin>>m1>>m2>>n1>>n2;
   int ans=0;
   for (int i=m1;i<=m2;i++) {
           int x=i*i;
           int count=0;
           for (int k=n1;k<=n2;k++) {
               if (judge(x,k)) count++;
               if (count > 1) break;//多于一个,不能算。
        }
        if (count==1) ans++;
   }
   cout<<ans;
   return 0;
}

二)    不超过n位的正整数中,有多少个回文数?
输入    一个正整数n,n <= 10。
输出    一个整数,即回文数个数。
样例输入
    5
样例输出
    1098
问题解析:这道题可以用作回文函数练习,不过,那样的话速度会偏慢。
n位正整数中回文数有9乘10的(n-1)/2次方个,
比如n=1的时侯,答案是9; n=2的时侯,答案是9+9=18,
n=3的时侯,90+18=108
根据这条公式,可以有下面的解法:
using namespace std;
int n,b,i,j,s[10],sum;
int fn(int n) // 递归
{
    if(n==0) return 0; //n位正整数中回文数有9乘10的(n-1)/2次方个
    b=(n-1)/2;
    return s[b]+fn(n-1);
}
int main() //这个程序可以求不超过n位的正整数中回文数的个数(n<=10)
{
    cin>>n;
    s[0]=9;
    for(i=1;i<=n;i++) //生成一个10、10^2、10^...的数组
        s[i]=s[i-1]*10;
    printf("%d",fn(n));
}

三)openjudge素数回文数的个数
    求11到n之间(包括n),既是素数又是回文数的整数有多少个。
输入
    一个大于11小于1000的整数n。
输出
    11到n之间的素数回文数个数。
样例输入
    23
样例输出
    1
using namespace std;
int prime(int n){
    int i;
    if(n<=1) return 0;
    for(i=2; i<=n/2;i++)
        if(!(n % i)) return 0;
    return 1;
}
int inv(int n){
    int x=0;
    while(n){
        (x*=10) += n % 10;
         n/=10;
     }
    return x;
    }

int main(){
    int m,n;
    scanf("% d",&n);
    int sum    =0;
    for(int i=11;i<=n;i++)
        if(prime(i) && inv(i)==i)
        {
          sum++;
          }
    printf("%d",sum);
    return 0;
}


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有