【算法】复杂了一点点的数字回文
【题目描述】
[蓝桥杯][历届试题]回文数字
时间限制: 1Sec 内存限制: 128MB 提交: 6668 解决: 2736
题目描述
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。
输入
一个正整数 n (10< n< 100), 表示要求满足的数位和。
输出
若干行,每行包含一个满足要求的5位或6位整数。
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1
样例输入
44
样例输出
99899 499994 589985 598895 679976 688886 697796 769967 778877 787787 796697 859958 868868 877778 886688 895598 949949 958859 967769 976679 985589 994499
【整体思路】:
- 判断当前该数是否是回文(通过翻转的形式判断,十分简短容易理解)
- 计算当前该数的各位数之和
- 进行判断并输出(在输出的时候注意如果不存在的话需要输出-1,所以可以根据是否存在满足条件数,存在的话就++,如果一直没有那么计数器就是0,则输出
【具体代码】
1 //回文数字判断的基础上要求满足各位数之和为输入的数字,并且是5位或者6位 2 #include<stdio.h> 3 int hui(int number); 4 int sum(int number); 5 6 int main() 7 { 8 int n,i,huiwen,s,su; 9 su=0; 10 scanf("%d",&n); 11 for(i=10000; i<=999999; i++) 12 { 13 huiwen=hui(i); 14 s=sum(i); 15 if(huiwen&&s==n) 16 { 17 printf("%d\n",i); 18 su++; 19 } 20 } 21 if(su==0) 22 { 23 printf("-1"); 24 } 25 26 return 0; 27 } 28 //判断是否是回文 29 int hui(int number) 30 { 31 int reverse=0; 32 if(number%10==0) 33 { 34 return 0; 35 } 36 while(number>reverse) 37 { 38 reverse=number%10+reverse*10; 39 number=number/10; 40 } 41 return number==reverse||number==reverse/10; 42 } 43 //计算数字各位数之和 44 int sum(int number) 45 { 46 int s=0; 47 while(number!=0) 48 { 49 s=s+number%10; 50 number=number/10; 51 } 52 return s; 53 }