USACO Training Section 1.2 Dual Palindromes 解题报告&AC代码

解题报告:

这依然是一道可以用中规中矩方法做出来的题。

我的方法是从start扫描到最大整数(2147483647,他说了不会超的么…),判断这个数是不是“双重回文”,如果是,输出这个数,计数器(就是那个输入的N)自减。

当N == 0的时候,我们的工作也就完成啦。

至于判断的部分,从2扫描到10,对将要处理的数x转换成每一种进制分别判断(就是第i位 ==  第(n - i)位,假设K进制下这个数有n位的话),如果是,那么计数器++。

最后返回(计数器 > 1)的真假就好啦。

AC代码:

/*
ID: yuanmz91
PROG: dualpal
LANG: C++
*/
#include <fstream>
using namespace std;
const int MAX_OF_INT = 2147483647;  //有符号整形最大值,(2的31次方) - 1
const int MAX_LEN = 32;  //一个数的最大位数,当然就是二进制下的MAX_OF_INT,这里多留出来一位…我也不知道我当时怎么想的…
bool Deal(int);
int main()
{
    ifstream fin("dualpal.in");
    ofstream fout("dualpal.out");
    int N, start;  //N是要求的数的个数, start是起始数值(注意start本身不是要算的数!)
    fin >> N >> start;
    for(int i = start; i != MAX_OF_INT; ++i)
    {
        if(Deal(i + 1))  //从(start + 1)开始
        {
            fout << i + 1 << endl;
            N--;
        }
        if(N == 0)
        {
            break;
        }
    }
    return 0;
}
bool Deal(int x)
{
    int counter = 0;
    for(int i = 2; i != 11; ++i)
    {
        int buffer[MAX_LEN];  //存放转换好的数
        int number = x, mark = 0;  //转换前的的数,以及转换中的位数浮标(在后面还可以用作转换后数的位数)
        int flag = true;  //在判断之前…我们暂且认为啥都是回文数,一旦发现不对再改么…
        while(number != 0)
        {
            buffer[mark++] = number % i;
            number /= i;
        }  //这里是一个经典的进制转换…在我以前的代码里多次出现…(吐槽:USACO怎么那么多回文…)
        for(int j = 0; j != mark; ++j)
        {
            if(buffer[j] != buffer[mark - j - 1])
            {
                flag = false;  //好吧,我们发现对不上号了…你遗憾的被…
                break;  //PASS了……
            }
        }
        if(flag == true)
        {
            counter++;  //如果在事实证明我们之前的猜想是正确的,计数器就可以++了
        }
    }
    return (counter > 1);  //如果有多于一种(就是至少两种),他就是真的。
}


下面是题

英文版:

Dual Palindromes
Mario Cruz (Colombia) & Hugo Rickeboer (Argentina)

A number that reads the same from right to left as when read from left to right is called a palindrome. The number 12321 is a palindrome; the number 77778 is not. Of course, palindromes have neither leading nor trailing zeroes, so 0220 is not a palindrome.

The number 21 (base 10) is not palindrome in base 10, but the number 21 (base 10) is, in fact, a palindrome in base 2 (10101).

Write a program that reads two numbers (expressed in base 10):

  • N (1 <= N <= 15)
  • S (0 < S < 10000)

and then finds and prints (in base 10) the first N numbers strictly greater than S that are palindromic when written in two or more number bases (2 <= base <= 10).

Solutions to this problem do not require manipulating integers larger than the standard 32 bits.

PROGRAM NAME: dualpal

INPUT FORMAT

A single line with space separated integers N and S.

SAMPLE INPUT (file dualpal.in)

3 25

OUTPUT FORMAT

N lines, each with a base 10 number that is palindromic when expressed in at least two of the bases 2..10. The numbers should be listed in order from smallest to largest.

SAMPLE OUTPUT (file dualpal.out)

26
27
28


中文版:

Dual Palindromes 双重回文数

描述

如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。

事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。

编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。

本问题的解决方案不需要使用大于32位的整型

格式

PROGRAM NAME: dualpal

INPUT FORMAT:

(file dualpal.in)

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

OUTPUT FORMAT:

(file dualpal.out)

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

测试数据如下:

Here are the test data inputs:

------- test 1 ----
5 1
------- test 2 ----
9 10
------- test 3 ----
15 9900
------- test 4 ----
10 90
------- test 5 ----
12 125
------- test 6 ----
12 1900
------- test 7 ----
8 500

Keep up the good work!


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值