题目:
资源限制
内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54。
这里小编是一个入门级新手,第一次独立解决的一个问题,也是第一次发博客,若思路在您看来不好请见谅(叠个小甲QWQ)
思路:首先根据他的要求,一串数字从左读从右读都一样,说明它是对称的,那么我们就可以先构建一个数组,他的数组下标首末位置(递增减)的值对应相等。通过枚举法循环,将对应的值先全列出来,接着再通过if条件语句的嵌套,让他满足题目中的两个条件,最后输出全部的符合条件的数。
以下是具体的代码:
#include<stdio.h>
int main()
{
char str[6]; //这里最多是6位数,数组从str[0]开始,增加一个字符用于存储字符串结尾的'\0'
int i;
int n;
scanf("%d",&n);
for(i=10000;i<=99999;i++) //首先找五位数
{
sprintf(str,"%d",i); //通过sprintf函数,将i的值直接放入对应数组的位置
if(str[0]==str[4]&&str[1]==str[3]) //对称下标位置的值相等
{
if(n==str[0]-'0'+str[1]-'0'+str[2]-'0'+str[3]-'0'+str[4]-'0')
/*
在C语言中,char类型默认是有符号的,因此在计算str[0]+str[1]+str[2]+str[3]+str[4]
和str[0]+str[1]+str[2]+str[3]+str[4]+str[5]
时,会将char类型转换为int类型进行计算。但是,str[0]+str[1]+str[2]+str[3]+str[4]
和str[0]+str[1]+str[2]+str[3]+str[4]+str[5]
的结果可能超出char类型的表示范围,导致溢出。为了解决这个问题,可以将str[0]+str[1]+str[2]+str[3]+str[4]
和str[0]+str[1]+str[2]+str[3]+str[4]+str[5]
的结果转换为int类型再进行比较
*/
{
printf("%s\n",str);
}
}
}
for(i=100000;i<=999999;i++) //随后找六位数与上述同理
{
sprintf(str,"%d",i);
if(str[0]==str[5]&&str[1]==str[4]&&str[2]==str[3])
{
if(n==str[0]-'0'+str[1]-'0'+str[2]-'0'+str[3]-'0'+str[4]-'0'+str[5]-'0')
{
printf("%s\n",str);
}
}
}
return 0;
}