53 双重回文数

问题描述 :

如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做回文数。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。 编一个程序,从文件读入两个十进制数 N (1<= N <= 15) S (0 <S <10000) 然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。 本问题的解决方案不需要使用大于4字节的整型变量。

输入说明 :

只有一行,用空格隔开的两个数N和S。

输出说明 :

N行, 每行一个满足上述要求的数,并按从小到大的顺序输出。

输入范例 :3 25

输出范例 :

26
27
28

 

思想:写一个函数,输入一个数和目标进制,先转换进制(取余,除二,直到为0),把转换后的结果存到数组中,然后判断这个数组是否对称即可,返回一个计数,遍历当前数的2-10进制,如果计数大于等于2,那么结束,输出即可。

复制代码
#include <stdio.h>
#include <stdlib.h>


int change(int num,int c){
    int res[1000]={0};
    int i,j;
    int k =0;
    for(i = 0;num!=0;i++){
        res[i] = num%c;
        num /=c;
    }
    for(j = i-1;j>=i/2;j--){
        if(res[j]!=res[k]){
            return 0;
        }
        k++;
    }
    return 1;

}



int main()
{
    int num,start;
    int count;
    int cnt =0;
    scanf("%d %d",&num,&start);
    for(int j = start+1;cnt!=num;j++){
        count = 0;
        for(int i =2;i<=10;i++){
            count+=change(j,i);
                if(count==2){
                printf("%d\n",j);
                cnt++;
                break;
            }
        }
        
    }
   
    return 0;
}
复制代码

 

posted @   梦想是能睡八小时的猪  阅读(128)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示