USACO Section 1.2 Dual Palindromes

来源:互联网 发布:剑灵天族枪手捏脸数据 编辑:程序博客网 时间:2024/06/05 07:05

题目描述

从左到右读取数字从左到右读取相同的数字称为回文。 数字12321是回文; 数字77778不是。 当然,回文没有前导和尾随零,所以0220不是回文。
数字21(基数10)在基数10中不是回文,而数字21(基数10)实际上是基数2(10101)中的回文。

编写一个读取两个数字的程序(以10为基数):
N(1 <= N <= 15)
S(0 <S <10000)
然后在两个或多个数字基础(2 <= base <= 10)中查找和打印(在10)中严格大于S的前N个数字,它们是回文。
这个问题的解决方案不需要操纵大于标准32位的整数。

程序名称:dualpal

输入格式

单行空格分隔整数N和S.

输入(file dualpal.in)

3 25

输出格式

N行,每个都有至少两个基中表达的基数为10的回文。 这些数字应该按照从小到大的顺序列出。

输出(file dualpal.out)

26
27
28

解题思路

本题主要思路是,找出大于s的n个数使得这些数转化为2~10进制的字符串形式时有两种或两种以上为回文数。则我们必须把大于s的每个数转换为2~10进制的形式判断是否有两种或者两种以上为回文数,若是且是的个数不超过n则输出。

解题代码

/* ID: 15189822PROG:  dualpalLANG: C++ */  #include<iostream>#include<fstream>#include<cstring>using namespace std;ofstream fout ("dualpal.out");ifstream fin ("dualpal.in"); void zhuanhuan(char *a, int num, int base){    int k = 0, temp;    while(num){        temp = num % base;        if(temp<10) a[k++]=temp+'0'; else a[k++]='A'+temp-10;        num/=base;    }    a[k] = '\0';}bool panduan(char *a){    bool ans=true;    char t[100];    int l=strlen(a);    for(int i=0;i<l;i++) t[l-i-1]=a[i];    t[l]='\0';    if(strcmp(a,t)==0) return true; else return false;}int main(){int n, s, ok;    char a[100];    fin>>n>>s;    for(s++;n>0;s++){        ok = 0;        for(int i=2;i<=10;i++){            zhuanhuan(a,s,i);            if(panduan(a)) ok++;            if(ok>=2){                fout<<s<<endl;                n--;                break;            }        }    }    return 0;}