zoj 2000

求第n个回文数

很有意思的一道题目,刚开始的时候想要打表直接存起来,但是n太大,打表存不下。

然后在网上搜了下,提示是按照康托展开,和找规律

1位的时候有9个回文数

2位的时候有9个

3位的时候有90个

4位的时候有90个

5位的时候有900个

可以发现,每长度增加两位,个数*10;

代码:

#include <stdio.h>
#include <string.h>
void slove(int n)
{
    int s=9,ans=1;
    while(n>s*2)
    {
        n-=s*2;
        s*=10;
        ans*=10;
    }//p判断第n个数是多少位(这个位将两个合在了一起,比如1和2,算成一起)

    ans+=(n%s==0?s:n%s)-1;//判断第n个数是在奇数位(例如1位)还是偶数位(例如2位)
    printf("%d",ans);//回文数的构成规则,将一个数分成两部分,后边的和前边的相同,这是输出前半部分。
    if(n-s<=0)//第n个数在奇数位上
        ans/=10;//奇数位上的回文数,如111.是由11和1组成的故ans需要除10,先输出11后在输出1。
    while(ans)
    {
        printf("%d",ans%10);//输出后半部分
        ans/=10;
    }
    printf("\n");
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n)
    {
        slove(n);
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值