回文数
问题描述
问题描述
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
按从小到大的顺序输出满足条件的四位十进制数。
问题分析
满足条件:两端相等,长度范围确定。逐一枚举遍历
代码实现
#include <iostream> #include <bits/stdc++.h> using namespace std; int main(){ int g,s,b,q;
for(int j=1000;j<10000;j++){ g=j%10; s=j/10%10; b=j/100%10; q=j/1000; if(g==q&&s==b) cout<<j<<endl; } }
|
运行结果
1001 1111 1221 1331 1441 1551 1661 1771 1881 1991 2002 2112 2222 2332 2442 2552 2662 2772 2882 2992 3003 3113 3223 3333 3443 3553 3663 3773 3883 3993 4004 4114 4224 4334 4444 4554 4664 4774 4884 4994 5005 5115 5225 5335 5445 5555 5665 5775 5885 5995 6006 6116 6226 6336 6446 6556 6666 6776 6886 6996 7007 7117 7227 7337 7447 7557 7667 7777 7887 7997 8008 8118 8228 8338 8448 8558 8668 8778 8888 8998 9009 9119 9229 9339 9449 9559 9669 9779 9889 9999
-------------------------------- Process exited after 0.2804 seconds with return value 0 请按任意键继续. . .
|
总结
回文数主要控制范围,以及满足其特征要求逐一遍历即可
特殊回文数
问题描述
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54。
问题分析
首先判断是否属于回文数,这里区别在于奇数位与偶数位,奇数位中间数不等于任何两边的,这点与偶数位的不同,同时此处特殊在于,每个数位相加的和要满足等于输入的数字。此处要注意是拆分每一个数位,个、十、百、千、万...的拆分
代码实现
#include <iostream> #include <string> #include <bits/stdc++.h> using namespace std; int main(){ int num,g,s,b,q,w,sw; cin>>num; for(int i=10000;i<100000;i++){ g=i%10; s=i/10%10; b=i/100%10; q=i/1000%10; w=i/10000; if(g==w&&s==q&&g+s+b+q+w==num) cout<<i<<endl; } for(int j=100000;j<1000000;j++){ g=j%10; s=j/10%10; b=j/100%10; q=j/1000%10; w=j/10000%10; sw=j/100000; if(g==sw&&s==w&&b==q&&g+s+b+q+w+sw==num) cout<<j<<endl; } }
|
运行结果
44 99899 499994 589985 598895 679976 688886 697796 769967 778877 787787 796697 859958 868868 877778 886688 895598 949949 958859 967769 976679 985589 994499
-------------------------------- Process exited after 2.738 seconds with return value 0 请按任意键继续. . .
|
总结
回文数的特点在于两端数字分别相等,此处的特殊回文数则需要枚举所有的五位和六位整数,先判断它们是否为回文数,然后再计算所有数字和,判断是否为num。