跳至正文

USACO 1.5.2 Prime Palindromes

  • OI路程

  这一题我用的依然是以前的解法,现只求回文数,而且偶数回文数不需要求(如:312213)必定是11的倍数但是11要特殊处理,反正这一次我错了不少地方。
  1,把变量名写错了,上面分明是给a赋值,下面却写成了对b进行操作。

  2,对于回文数的制造的下标弄错了(不好细说,看代码里的注释和上下文把。)
  3,循环的范围错误,也是制造回文的错误!
  4,字符串的结尾忘记’\0’了。
  5,搜索的范围错误!!
  一次AC,代码如下:
/
LANG: C
ID: yylogoo2
PROG: pprime
/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a, b;

int isprime(int num)
{
        int i, li;
        if(num == 2 || num == 3 || num == 5 || num == 7 || num == 11 ||
                        num == 13){
                return 1;
        }
        if(num % 2 == 0 || num % 3 == 0 || num % 5 == 0 || num % 7 == 0 ||
                num % 11 == 0 || num % 13 == 0){
                return 0;
        }
        li = sqrt(num);
        for(i = 17; i <= li; i++){
                if(num % i == 0){
                        return 0;
                }
        }
        return 1;
}

void check(int num)
{
        if(num > b){
                exit(0);
        }
        if(num < a){
                return ;
        }
        if(isprime(num)){
                printf("%d\n", num);
        }
}

char tmp[9];

int makenum(int num)
{
        int i, j;
        sprintf(tmp, "%d", num);
        i = j = strlen(tmp);
        /
        Mistack 2:
          i的初始值错误!
        
/
        i -= 2;
        /
        Mistack 3:
          范围错误了,, 应该是i >= 0, 不是i != 0
        
/
        while(i >= 0){
                tmp[j] = tmp[i];
                i–, j++;
        }
        /
        Mistack 4:
          字符串没有以’\0’结尾
        
/
        tmp[j] = ‘\0’;
        sscanf(tmp, "%d", &num);
        return num;
}

void srch(int i, int j)
{
        int num;
        while(i <= j){
                num = makenum(i);
                /
                Mistack 1:
                  把下面的参数num写成了i, 所以导致错误!
                
/
                check(num);
                i++;
        }
}

int main(void)
{
        int i;
        freopen("pprime.in""r"stdin);
        freopen("pprime.out""w"stdout);
        scanf("%d%d", &a, &b);
        check(5);
        check(7);
        check(11);
        /
        Mistack 5:
          应该是从10开始, 而不是100
        
/
        srch(109999);
        return 0;
}

发表评论

您的电子邮箱地址不会被公开。