【算法】复杂了一点点的数字回文

【题目描述】

[蓝桥杯][历届试题]回文数字

时间限制: 1Sec 内存限制: 128MB 提交: 6668 解决: 2736

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

【整体思路】:

  1. 判断当前该数是否是回文(通过翻转的形式判断,十分简短容易理解)
  2. 计算当前该数的各位数之和
  3. 进行判断并输出(在输出的时候注意如果不存在的话需要输出-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  }

 

posted @ 2020-04-09 10:06  美好事物  阅读(243)  评论(0编辑  收藏  举报