跳至正文

USACO 1.2.5 Dual Palindromes

  • OI路程

  本来应该是很简单的一个题目,因为昨天才写前面一题(USACO 1.2.4 Palindromic Squares),就是使用那里写的一些子函数即可AC,但是因为现在是以学习为目的,所以自然是重写一次,但是重写同样的两个函数,却出现了不应该有的错误,具体错误如下:

  1、在循环之后忘记更改循环变量了,就是说比如:for(i = 0; i <= 10; / 相当于这里没写 / ),自然循环就无法结束了!
  2、在数组里面直接使用长度作为下表,又比如:char str[10] = "12345",而我想通过str[strlen(str)]来指向最后一个字符,明显是错误!应该是str[strlen(str) – 1]才能使用最后一个字符!
  和昨天的代码比较了一下,昨天的代码层次性更强,直接将字符串的长度作为参数传给了判断是否为回文数的函数,而今天是在判断回文数的函数内部进行的!
  不过因为没有别的问题,所以还是一次性AC了:
/
LANG: C
ID: yylogoo2
PROG: dualpal
/
#include <stdio.h>
#define STR "0123456789"
#define MAX 50
char str[MAX];

int change(int num, int base)
{
        int i = MAX;
        while(num != 0){
                str[–i] = STR[num % base];
                num /= base;
        }
        return i;
}

int ispal(int start)
{
        char num = &str[start];
        /

        Mistack 2:
          下面j的赋值错误了。第一次是写成了j = MAX – i, 后来修改成了j = MAX – i – 1  还是错了
        最后一次才改对.. 
        /
        int i = 0, j = MAX – start – 1;
        while(i < j){
                if(num[i] != num[j]){
                        return 0;
                }
                /

                Mistack 1:
                   忘记下面的递增和递减!
                */
                i++, j–;
        }
        return 1;
}

int main(void)
{
        int i, j, k, l;
        int m, n;
        freopen("dualpal.in""r"stdin);
        freopen("dualpal.out""w"stdout);
        scanf("%d%d", &m, &n);
        for(i = n + 1, k = 0; k < m; i++){
                l = 0;
                for(j = 2; j <= 10 && l != 2; j++){
                        if(ispal(change(i, j))){
                                l++;
                        }
                }
                if(l == 2){
                        printf("%d\n", i);
                        k++;
                }
        }
        return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注