问题描述 观察数字: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 }