NOIP 1999 普及组 复赛 回文数

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;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值