问题描述:
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
989989
998899
数据规模和约定
1<=n<=54。
解答:
整体思路:
枚举并逐个判断
细节:
回文数据的按位处理
个人参考代码:
1 #include<iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 cin>>n; 9 10 for(int data=10000;data<100000;data++) //五位数情形 11 { 12 int a=data/10000; 13 int b=(data/1000)%10; 14 int c=(data/100)%10; 15 int d=(data/10)%10; 16 int e=data%10; 17 18 if(a==e&&b==d) 19 { 20 int sum=a+b+c+d+e; 21 if(sum==n) cout<<data<<endl; 22 } 23 } 24 25 for(int data=100000;data<1000000;data++) //六位数情形 26 { 27 int a=data/100000; 28 int b=(data/10000)%10; 29 int c=(data/1000)%10; 30 int d=(data/100)%10; 31 int e=(data/10)%10; 32 int f=data%10; 33 34 if(a==f&&b==e&&c==d) 35 { 36 int sum=a+b+c+d+e+f; 37 if(sum==n) cout<<data<<endl; 38 } 39 } 40 41 return 0; 42 }
运行超时代码——vector版本:
1 #include<iostream> 2 #include<vector> 3 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 cin>>n; 10 11 for(int data=10000;data<=999999;data++) 12 { 13 int dataTemp=data; 14 15 vector<int> dataArray; 16 17 while(dataTemp!=0) 18 { 19 dataArray.push_back(dataTemp%10); 20 dataTemp/=10; 21 } 22 23 int flag=1; 24 int sum=0; 25 for(int i=0;i<=dataArray.size()/2;i++) 26 { 27 if(dataArray[i]!=dataArray[dataArray.size()-1-i]) 28 { 29 flag=0; 30 break; 31 } 32 } 33 34 if(flag==1) 35 for(int i=0;i<=dataArray.size()-1;i++) 36 { 37 sum+=dataArray[i]; 38 } 39 40 41 if(flag==1&&sum==n) 42 cout<<data<<endl; 43 } 44 45 return 0; 46 }
教训:慎用vector容器处理动态内存,vector容器处理动态内存非常耗时