UVALive2389 ZOJ1078 Palindrom Numbers【回文+进制】

Palindrom Numbers

Time Limit: 2 Seconds        Memory Limit: 65536 KB

Statement of the Problem

We say that a number is a palindrom if it is the sane when read from left to right or from right to left. For example, the number 75457 is a palindrom.

Of course, the property depends on the basis in which is number is represented. The number 17 is not a palindrom in base 10, but its representation in base 2 (10001) is a palindrom.

The objective of this problem is to verify if a set of given numbers are palindroms in any basis from 2 to 16.

Input Format

Several integer numbers comprise the input. Each number 0 < n < 50000 is given in decimal basis in a separate line. The input ends with a zero.

Output Format

Your program must print the message Number i is palindrom in basis where I is the given number, followed by the basis where the representation of the number is a palindrom. If the number is not a palindrom in any basis between 2 and 16, your program must print the message Number i is not palindrom.

Sample Input

17
19
0

Sample Output

Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom


Source:  South America 2001



Regionals 2001 >> Latin America - South America


问题链接UVALive2389 ZOJ1078 Palindrom Numbers入门训练题,用C语言编写程序。

题意简述:输入若干个整数,0作为结束。对于输入的整数n,问其几进制为回文数?

问题分析

这是一个有关进制处理的问题,都是套路。

程序中,封装了一个函数ispalindrom()用于将整数转换为指定进制的字符串,同时判断是否为回文数。使用数组ans[]作为标志,其元素个数需要多一个,是否为回文数的标志放在ans[0]中。

程序说明

原来的C语言程序不够简洁,又写了一版C++的程序。

UVALive的问题与ZOJ的问题微妙的差异需要注意,ZOJ中不存在回文时,输出的字符串为:“Number 19 is not a palindrom”,多一个“a”,坑啊!!!


AC的C++语言程序如下:

/* UVALive2389 ZOJ1078 Palindrom Numbers */

#include <iostream>
#include <string.h>

using namespace std;

const int N = 16;

bool ispalindrome(int product, int base)
{
    int miror = 0, temp;

    temp = product;
    while(temp) {
        miror *= base;
        miror += temp % base;

        temp /= base;
    }

    return miror == product;
}

int main()
{
    int n;
    int ans[N+1];

    while(cin >> n && n) {
        memset(ans, 0, sizeof(ans));

        for(int i=2; i<=N; i++)
            if(ispalindrome(n, i))
                ans[0] = 1, ans[i] = 1;

        if(ans[0]) {
            cout << "Number " << n << " is palindrom in basis";
            for(int i=2; i<=N; i++)
                if(ans[i])
                    cout << " " << i;
            cout << endl;
        } else
            cout << "Number " << n << " is not palindrom" << endl;
    }

    return 0;
}


AC的C语言程序如下:

/* UVALive2389 ZOJ1078 Palindrom Numbers */

#include <stdio.h>
#include <memory.h>

#define MAXN1 20000
#define MAXN2 16

char t[MAXN1];

int ispalindrom(int val, int base)
{
    int count=0, start, end;

    while(val) {
        t[count++] = val % base;
        val /= base;
    }

    start = 0;
    end = count - 1;
    count = 1;
    while(start < end) {
        if(t[start] != t[end]) {
            count = 0;
            break;
        }

        start++;
        end--;
    }

    return count;
}

int main(void)
{
    int n, i;
    int ans[MAXN2+1];

    while(scanf("%d", &n) != EOF && n != 0) {
        memset(ans, 0, sizeof(ans));

        for(i=2; i<=MAXN2; i++)
            if(ispalindrom(n, i)) {
                ans[0] = 1;
                ans[i] = 1;
            }

        if(ans[0]) {
            printf("Number %d is palindrom in basis", n);
            for(i=2; i<=MAXN2; i++)
                if(ans[i])
                    printf(" %d", i);
            printf("\n");
        } else
            printf("Number %d is not palindrom\n", n);
    }

    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值