求对称数(C语言)

 

题目描述:

如果给定一个对称数n,请你求出大于n的最小对称数(即这个数从左向右读和从右向左读是完全一样的)。

输入:

第一行输入t(0<t<19999);
接下来的t行,每行输入一个n(0<n<10^9)。

输出:

与输入相对应,每行输出一个大于n的最小对称数m。

样例输入 :

6
1
11
99
789987
123454321
999999999

样例输出:

2
22
101
790097
123464321
1000000001

源代码:

#include<stdio.h>
int jiweishu(long long n);//判断n是几位数
int quanjiu(long long n);//全为9
int main()
{
    int ch[100];
    int t;
    long long n,oo;
    int shu;//几位数
    scanf("%d",&t);
    for(int i=0; i<t; i++)
    {
        scanf("%lld",&n);
        oo=n;
        shu=jiweishu(n);
        for(int c=0; c<shu; c++)
        {
            ch[c]=oo%10;
            oo=oo/10;
        }
        if(n<=8)
        {
            printf("%lld\n",n+1);
            continue;
        }
        if(quanjiu(n))
        {
            printf("%lld\n",n+2);
            continue;
        }
        if(shu%2==1)
        {
            if(ch[shu/2]!=9) //中间不等于9
            {
                ch[shu/2]++;
                for(int j=0; j<shu; j++)
                {
                    printf("%d",ch[j]);
                }
                printf("\n");
                continue;
            }
            else //中间等于9
            {
                ch[shu/2]=0;
                for(int a=shu/2; a<shu; a++)
                {
                    if(ch[a]==9) //中间数左右等于9
                    {
                        ch[a]=0;
                        ch[shu-1-a]=ch[a];
                    }
                    else
                    {
                        if(a!=shu/2)
                        {
                            ch[a]++;
                            ch[shu-1-a]=ch[a];
                            break;
                        }

                    }
                }
                for(int d=0; d<shu; d++)
                {
                    printf("%d",ch[d]);
                }
                printf("\n");
                continue;
            }
        }
        if(shu%2==0)
        {
            if(ch[shu/2]!=9)
            {
                ch[shu/2]++;
                ch[shu/2-1]=ch[shu/2];
                for(int j=0; j<shu; j++)
                {
                    printf("%d",ch[j]);
                }
                printf("\n");
                continue;
            }
            else if(ch[shu/2]==9)
            {
                ch[shu/2]=0;
                ch[shu/2-1]=ch[shu/2];
                for(int a=shu/2; a<shu; a++)
                {
                    if(ch[a]==9) //中间数左右等于9
                    {
                        ch[a]=0;
                        ch[shu-1-a]=ch[a];
                    }
                    else
                    {
                        if(a!=shu/2)
                        {
                            ch[a]++;
                            ch[shu-1-a]=ch[a];
                            break;
                        }

                    }
                }
                for(int d=0; d<shu; d++)
                {
                    printf("%d",ch[d]);
                }
                printf("\n");
                continue;
            }
        }

    }
    return 0;
}

int jiweishu(long long n)
{
    int i;
    for(i=1;; i++)
    {
        n=n/10;
        if(n==0)
            return i;
    }

}

int quanjiu(long long n)
{
    for(int i=0;; i++)
    {
        if(n%10==9)
        {
            n=n/10;
            if(n==0)
                break;
        }
        else
            return 0;
    }
    return 1;
}

解题思路:

先从键盘输入一个数赋值给t表示将要求对称数的个数。再从键盘输入数赋值给n表示为要求对称数的数。把n的每位数存入数组中。如果n小于等于8则直接输入比n大1的数。若n每位都为9则输出n+2的数。若n的位数为奇数,且最中间的数不为9则中间的数加一并输出,若最中间等于9,中间数赋值0并查看中间数左边的数是否为9,若为9则赋值0且对称位置也赋值0,若不为9则加1且对称位置也加一。输出结果。若n的位数为偶数,若最中间两个数不为9则两个数都加1。若中间两个数都为9,则中间两个数都赋值0,并查看中间数左边的数是否为9,若为9则赋值0且对称位置也赋值0,若不为9则加1且对称位置也加一。输出结果。

算法步骤:

  1. 输入一个数赋值给t;
  2. 再输入对称数赋值给n;
  3. 将n的每位数存入数组中;
  4. 判断n是否小于等于8,是则直接输出n+1,否则继续;
  5. 判断n是否每位都是9,是则直接输出n+2,否则继续;
  6. 判断n的位数是否为奇数;否则继续
  7. 是则判断最中间的数是否为9,否则最中间数加一并输出,是则中间值为0查看左右值若不为9左右值加一并输出,若为9则左右值为0并继续查看
  8. 判断n的位数是否为偶数。
  9. 同奇数方法

遇到的问题:

只考虑了最中间的数为9每考虑最中间数的两边也为9

解决办法:判断中间数为9后继续判断左边数是否为9并把值赋值给对称的位置

 

  • 5
    点赞
  • 10
    收藏
  • 打赏
    打赏
  • 2
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

沐林天释

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值