[蓝桥杯][历届试题]回文数字(题解)

题目描述

观察数字:12321,123321  都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。

本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。

输入

一个正整数  n  (10< n< 100),  表示要求满足的数位和。

输出

若干行,每行包含一个满足要求的5位或6位整数。 
数字按从小到大的顺序排列。 
如果没有满足条件的,输出:-1 

样例输入

44 

样例输出

99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499

方法一(简单取巧):

#include<stdio.h>
int main()
{
    int a,b,c,flag=1,i,n;
    scanf("%d",&n);
    for(i=1;i<=2;i++)
        for(a=1;a<10;a++)
            for(b=0;b<10;b++)
                for(c=0;c<10;c++)	
	            if(2*a+2*b+i*c==n){
	                flag=0;
	                if(i==1)	
                            printf("%d%d%d%d%d\n",a,b,c,b,a);
	                else		
                            printf("%d%d%d%d%d%d\n",a,b,c,c,b,a);
	            }
    if(flag)	
        printf("-1\n"); 	
    return 0;
}

方法二:

#include <stdio.h>
int main(void)
{
    int n, flag = 1;
    scanf("%d", &n);
    for(int i = 10000; i < 1000000; ++i)
    {
        int t = i, num = 0, sum = 0;
        while(t>0)
        {
            num = num*10 + t%10;
            sum += t%10;
            t /= 10;
        }
        if(num==i && sum==n)
        {
            flag = 0;
            printf("%d\n", i);
        }
    }
    if(flag)
    {
        printf("-1\n");
    }
     
    return 0;
}

解题思路:

题目种说5位数和6位数的,并且从小到大;我直接按顺序遍历10000到1000000(不包括)之间的数,把么一个数就求其回文和给位数字之和来判断时候复合要求;判断回文:数组也可以做到,但是在本题种使用本人的做法可以简单的将判断回文和求个位数字之和一起方便求得;比如给出1221:1221%10=1 ->1221/10=122 -> 1*10+122%10=12 ->122/10=12 

->12*10+12%10=122 -> 12/10=1 -> 122*10+1%10=1221  得到1221与原来给出得相等;

在举个反例:123:123%10=3 -> 123/10=12 -> 3*10+12%10=32 -> 12/10=1 ->32*10+1%10=321;

                            123 != 321  故不是回文数;

求个位数字之和只用在求回文得时候 每次取余得到得数累加求和即可。


注意事项:

在判断回文的时候,记得用一个临时变量代替正在遍历的数,不然会影响遍历顺序,导致程序出错。

方法三:

#include<iostream>
using namespace std;
bool check(int a[],int j){        //判断是否回文 
    int i;
    for(i=0;i<j;i++){
        if(a[i]!=a[j-i-1])
            return false;
    }
    return true;
}
int main()
{
    int n;
    cin>>n;
    int flag = 0;
    for(int i=10001;i<=999999;i++){
        int sum=0;
        int temp = i;
        int *b = new int(6);
        int j = 0;
        while(temp){
            sum+=temp%10;
            b[j++] = temp%10;
            temp/=10;
        }
        if(check(b,j)&&n == sum){
            flag = 1;
            cout<<i<<endl;
        }
        delete []b;
    }
    if(flag == 0){
        cout<<-1<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_48419914/article/details/115203256