您的位置:首页 > 其它

NOIP 1999 普及组 复赛 回文数

2017-11-10 11:37 369 查看
NOIP 1999 普及组 复赛 回文数

//1309 【例1.6】回文数(Noip1999)

//高精度加算法,很有信心

//后判断

//翻转

//先加

//30步跳出

//仔细看题,发现并不只是十进制,是N进制,马上意识到该题的难度了

//过了一晚之后,再想想,只要把十进制中的10换成N,并编写一个打印函数,打印位上的值大于等于10的 即可。

//题目没有明确位数个数,故数组均开到500

//样例通过,提交,未通过,

//因是历年NOIP普及组 复赛试题,容易得到测试数据

//看了看,确实会比较难过,因为输入数据中就有16进制

//马上对读取后的数据进行修改处理,题中没有说输入数据是否大写,或是小写,一并处理了

//再次提交,全未通过,查看原始输入输出数据

//查了 洛谷 P1015 回文数

//https://www.luogu.org/problemnew/show/1015

//洛谷上通过后,再进行提交,AC,

//http://ybt.ssoier.cn:8088中该题,没法看,直接参考洛谷里的题目,按里面的输入输出要求进行提交

//2017-11-10

#include <stdio.h>

#include <string.h>

int N,a[500],b[500],step=0;

char s[500];

void add(int a[],int b[]){

    int i;

    for(i=1;i<=a[0];i++){

        a[i]+=b[i];

        a[i+1]+=a[i]/N;

        a[i]%=N;

    }

    if(a[a[0]+1]>0)a[0]+=1;

}

int judge(int a[]){//0非回文,1回文

    int i;

    for(i=1;i<=a[0]/2;i++)

        if(a[i]!=a[a[0]-i+1])

            return 0;

    return 1;

}

void overturn(int a[]){

    int i,j=0;

    b[0]=a[0];

    for(i=a[0];i>=1;i--)

        b[++j]=a[i];//此处写成b[j]=a[i],j++;

}

void print(int a[]){

    int i;

    for(i=a[0];i>=1;i--)

        printf("%d",a[i]);

    printf("\n");

}

int main(){

    int len,i,k=0;

    scanf("%d%s",&N,s);

    len=strlen(s);

    for(i=len-1;i>=0;i--)//重写读入数据的处理

        if('0'<=s[i]&&s[i]<='9')

            a[++k]=s[i]-'0';

        else if('a'<=s[i]&&s[i]<='z')

            a[++k]=s[i]-'a'+10;

        else if('A'<=s[i]&&s[i]<='Z')

            a[++k]=s[i]-'A'+10;

    a[0]=len;

    while(judge(a)==0){

        //printf("1 "),print(a);

        overturn(a);

        //printf("2 "),print(b);

        add(a,b);

        //printf("3 "),print(a);

        step++;

        if(step==31)break;

    }

    

    if(step==31)printf("Impossible!");//此处写成 printf("Impossible");

    else printf("STEP=%d",step);//此处写成 printf("%d",step);

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: