试题 基础练习 特殊回文数
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54。
通关代码
#include<stdio.h>
#include<string.h>
int main()
{
int n;
int i,j;
scanf("%d",&n);
int num[7];//
int temp;
for(i=10000;i<=999999;i++)
{
temp = i;
int sum_num=0;
for(j=0;j<6;j++)
{
sum_num += temp%10;
num[j] = temp % 10;
temp /= 10;
//sum_num += num[j];此条语句也正确
}
// int count = strlen(num);
if(i<=99999)
{
if((sum_num==n) && (num[0] == num[4] && num[1] == num[3] ))
printf("%d\n",i);
else
continue;
}
else //if(count==6)
{
if((sum_num==n) && (num[0] == num[5] && num[1] == num[4] && num[2] == num[3] ))
printf("%d\n",i);
else
continue;
}
}
return 0;
}
解题思路
本题考察的是回文数
【什么是回文数:回文数就是有正序读取每个数字得出的数字序列和反序读取的数字序列都一样的一串数字序列】
读题的第一反映是用栈的方法,将正序进栈后出栈的序列和反序进栈后出栈的序列相比较,若两个序列都相同,那么就是回文数。
但其实这道题可以不用到栈,因为栈的方法略微复杂,可以直接暴力求解
题目规定是输出五位和六位数字,那么可以直接从i=10000开始暴力枚举到i=999999
用i控制枚举的数字,然后对这个数字取模求出每一位数字,将其放入到一个数组num[]中,并且用累加求出每一位数字的和sum,然后比较数组中的第一个元素与最后一个元素、第二个元素与倒数第二个元素、、、以此类推,若比较的两个元素都是相等的,那么这串数字就是回文数,如果数字i满足回文数并且sum等于n,那么这个数字i就是所求的特殊回文数,将其输出。