资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
数据规模和约定
1<=n<=54。
方法1:
思路:
1.判断是否是回文数;
2.判断是否各位数之和为n;
3.写两个函数,for循环判断
会超时!!!
代码:
#include<bits/stdc++.h>
using namespace std;
/**
1.满足是回文数
2.满足各项数的和等于输入值
*/
//方法1:超时
//判断是否为回文数
bool huiwen(int n){
string s = to_string(n);//数字转为字符串
string s2 = s;
reverse(s.begin(),s.end());
if(s == s2) return 1;
else return 0;
}
//求各项数之和
int s_sum(int n){
int sum = n % 10;
while((n/=10)!=0){//不能写成(n/10)!=0,不是确切的数
sum=sum+n%10;
}
return sum;
}
int main(){
int n;
scanf("%d",&n);
for(int i = 10000; i <= 999999; i++){
if(huiwen(i) == 1){
if(s_sum(i) == n){
cout<<i<<endl;
}
}
}
return 0;
}
①函数:求各项数之和
//求各项数之和
int s_sum(int n){
int sum = n % 10;
while((n/=10)!=0){//不能写成(n/10)!=0,不是确切的数
sum=sum+n%10;
}
return sum;
}
②函数:判断是否为回文数
bool huiwen(int n){
string s = to_string(n);//数字转为字符串
string s2 = s;
reverse(s.begin(),s.end());
if(s == s2) return 1;
else return 0;
}
方法2:找规律
思路:
1.五位数12321:
只需确定三个位数,后两个与前两个相同;
确定各个位数,手动使得为回文数 ;
if判断各个位数相加是否与n相等
2.五位数123321:
只需确定三个位数,后三个与前三个相同;
确定各个位数,手动使得为回文数 ;
if判断各个位数相加是否与n相等
代码:
#include<bits/stdc++.h>
using namespace std;
//方法2:找规律
/**
10001
10101
10201
...
11011
11111
11211
12011
12121
...
999999
*/
int main(){
int n;
scanf("%d",&n);
//先找五位数:12321要确定三个位数(3次for循环)
for(int i1 = 1; i1 <= 9; i1++){
for(int i2 = 0 ; i2 <= 9; i2++){
for(int i3 = 0; i3 <= 9; i3++){
if((i1+i2+i3+i2+i1) == n){//1.确定各个位数,手动使得为回文数 2.if判断是否与n相等
cout<<i1<<i2<<i3<<i2<<i1<<endl;
}
}
}
}
//再找六位数:123321要确定三个位数(3次for循环)
for(int i1 = 1; i1 <= 9; i1++){
for(int i2 = 0; i2 <= 9; i2++){
for(int i3 = 0; i3 <= 9; i3++){
if((i1+i2+i3+i3+i2+i1) == n){
cout<<i1<<i2<<i3<<i3<<i2<<i1<<endl;
}
}
}
}
return 0;
}