【程序设计竞赛】回文数字
问题描述 观察数字: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 样例输入 60 样例输出 -1
分析:
这个题目主要要明确两点:1.所有数字加起来和要等于N
2.要满足回文
故首先实现所有数字相加的功能
int sum_number(int number,int &n) { int sum=0; while(number) { sum=sum+number%10; number=number/10; n++; } return sum; }
这里给出的形参列表中多一个n,是计算number的个数
然后是判断回文:
两种思路:1.用数组 2.用栈(这个方法太慢了)
//用数组来进行判断 bool echo_number(int number,int goal) { int flag=true; int backup=number;//把数据取出来然后备份一下 int size=0; int *data; if(goal==sum_number(number,size)) { data=new int[size]; int i=size; i--; while(backup) { data[i]=backup%10; backup=backup/10; i--; } for(int i=0;i<size;i++) { int n=number%10; if(data[i]!=n) { flag=false; break; } number=number/10; } } else { flag=false; } return flag; }
用栈的方式:(由于计算和与入栈相同,故把两个函数合并起来写了)
bool echo_number(int number,int goal) { int sum=0; stack<int> echo; int flag=true; int temp=number;//把数据取出来然后放在栈中 while(temp) { sum=sum+temp%10; echo.push(temp%10); temp=temp/10; } if(goal==sum) { while(echo.size()) { int n=number%10; if(echo.top()!=n) { flag=false; break; } echo.pop(); number=number/10; } } else { flag=false; } return flag; }
完整代码
正确代码:
1 #include<iostream> 2 using namespace std; 3 int sum_number(int number,int &n) 4 { 5 int sum=0; 6 while(number) 7 { 8 sum=sum+number%10; 9 number=number/10; 10 n++; 11 } 12 return sum; 13 } 14 bool echo_number(int number,int goal) 15 { 16 int flag=true; 17 int backup=number;//把数据取出来然后备份一下 18 int size=0; 19 int *data; 20 if(goal==sum_number(number,size)) 21 { 22 data=new int[size]; 23 int i=size; 24 i--; 25 while(backup) 26 { 27 data[i]=backup%10; 28 backup=backup/10; 29 i--; 30 } 31 for(int i=0;i<size;i++) 32 { 33 int n=number%10; 34 if(data[i]!=n) 35 { 36 flag=false; 37 break; 38 } 39 number=number/10; 40 } 41 } 42 else 43 { 44 flag=false; 45 } 46 return flag; 47 } 48 int main() 49 { 50 int n; 51 int cont=0; 52 cin>>n; 53 for(int i=10000;i<=999999;i++) 54 { 55 if(echo_number(i,n)) 56 { 57 cout<<i<<endl; 58 cont++; 59 } 60 } 61 if(cont==0) 62 { 63 cout<<"-1"<<endl; 64 } 65 return 0; 66 }
用栈的方式,耗时很长:
1 /*输入格式 2 一个正整数 n (10<n<100), 表示要求满足的数位和。 3 输出格式 4 若干行,每行包含一个满足要求的5位或6位整数。 5 数字按从小到大的顺序排列。 6 如果没有满足条件的,输出:-1*/ 7 #include<iostream> 8 #include<stack> 9 using namespace std; 10 bool echo_number(int number,int goal) 11 { 12 int sum=0; 13 stack<int> echo; 14 int flag=true; 15 int temp=number;//把数据取出来然后放在栈中 16 while(temp) 17 { 18 sum=sum+temp%10; 19 echo.push(temp%10); 20 temp=temp/10; 21 } 22 if(goal==sum) 23 { 24 while(echo.size()) 25 { 26 int n=number%10; 27 if(echo.top()!=n) 28 { 29 flag=false; 30 break; 31 } 32 echo.pop(); 33 number=number/10; 34 } 35 } 36 else 37 { 38 flag=false; 39 } 40 return flag; 41 } 42 int main() 43 { 44 int n; 45 int cont=0; 46 cin>>n; 47 for(int i=10000;i<=999999;i++) 48 { 49 if(echo_number(i,n)) 50 { 51 cout<<i<<endl; 52 cont++; 53 } 54 } 55 if(cont==0) 56 { 57 cout<<"-1"<<endl; 58 } 59 return 0; 60 }
网上大神的代码:
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 int Sum(int n)//求各位数之和 6 { 7 int sum=0; 8 while(n) 9 { 10 sum+=(n%10); 11 n/=10; 12 } 13 return sum; 14 } 15 bool ishw(int n)//判断回文 16 { 17 char *s=new char; 18 int m; 19 s=itoa(n,s,10); 20 reverse(s,s+strlen(s)); 21 m=atoi(s); 22 if(n==m) 23 return true; 24 return false; 25 } 26 int main() 27 { 28 int n,flag=0; 29 cin>>n; 30 for(int i=10000;i<1000000;i++) 31 { 32 if(ishw(i)&&Sum(i)==n) 33 { 34 if(!flag) 35 flag=1; 36 cout<<i<<endl; 37 } 38 } 39 if(!flag) 40 cout<<"-1"<<endl; 41 return 0; 42 } 43 44 --------------------- 45 作者:Hoper_ 46 来源:CSDN 47 原文:https://blog.csdn.net/reidsc/article/details/65938289
(自己也得慢慢接触STL并且开始尝试用函数了,全部自己来做效率太低也很费时间)