USACO Section 1.2 Dual Palindromes

题目描述

从左到右读取数字从左到右读取相同的数字称为回文。 数字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: 15189822
PROG:  dualpal
LANG: 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;
}


猜你喜欢

转载自blog.csdn.net/YanLucyqi/article/details/72811670