用C++实现:特殊回文数

试题 基础练习 特殊回文数
资源限制
时间限制:1.0s   内存限制:512.0MB
问题描述
  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
  输入一行,包含一个正整数n。
输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定:1<=n<=54。

思路:直接从10000开始遍历至999999即可,一个循环解决

 1 #include<iostream>
 2 using namespace std;
 3 int main(void)
 4 {
 5     int n;
 6     cin >> n;
 7     int a, b, c, d, e, f, sum;     //这个sun是为了验证是否为回文数
 8     for (int i = 10000; i < 999999; i++)
 9     {
10         if (i / 100000 == 0)                    //5位数
11         {
12             a = i % 10;
13             b = ((i - a) / 10) % 10;
14             c = ((((i - a) / 10) - b) / 10) % 10;
15             d = ((((((i - a) / 10) - b) / 10) - c) / 10) % 10;
16             e = ((((((((i - a) / 10) - b) / 10) - c) / 10) - d) / 10) % 10;
17             int sum = a * 10000 + b * 1000 + c * 100 + d * 10 + e * 1;
18             if (sum == i && a + b + c + d + e == n)
19             {
20                 cout << sum << endl;
21             }
22         }
23         else                                    //6位数
24         {
25             a = i % 10;
26             b = ((i - a) / 10) % 10;
27             c = ((((i - a) / 10) - b) / 10) % 10;
28             d = ((((((i - a) / 10) - b) / 10) - c) / 10) % 10;
29             e = ((((((((i - a) / 10) - b) / 10) - c) / 10) - d) / 10) % 10;
30             f = ((((((((((i - a) / 10) - b) / 10) - c) / 10) - d) / 10) - e) / 10) % 10;
31             int sum = a * 100000 + b * 10000 + c * 1000 + d * 100 + e * 10 + f;
32             if (sum == i && a + b + c + d + e + f == n)
33             {
34                 cout << sum << endl;
35             }
36         }
37     }
38     return 0;
39 }

需要注意的几个问题:

                      (1):sum的作用。根据余数的计算方式,不难看出这里的sum是倒着来算的,这么做是为了验证这个数是不是回文数。如果sum不和i相等,就说明i不是回文数。

                      (2):5位数和6位数要分开讨论,不要混在一起。

                      (3):注意每一位数是如何算出来的。当然了,根据运算符号“/”的性质这里在算每一项的时候,没有必要减去a,b,c,d,e。因为在做出发的时候会自动舍弃余数。

再来分享一个网上看到的其他做法:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
 5 
 6 int main(int argc, char *argv[]) {
 7     using std::cout;
 8     int i,j;
 9     int n;
10     cin>>n;
11     int a[100];
12     for(i=1;i<=9;i++)            //五位十进制数,第五位不为0 
13     {
14         for(j=0;j<=9;j++)
15     {
16             if(((i+j)*2<=n) && ((i+j)*2>=n-9))
17             {
18             cout<<i<<j<<(n-i-i-j-j)<<j<<i<<endl;
19         }
20     }
21 }
22    
23     int f,g,h;
24     for(f=1;f<=9;f++)        //既然是六位十进制数,则第六位不为0 
25     {
26         for(h=0;h<=9;h++)
27         {
28             for(g=0;g<=9;g++)
29                 if((f+f+h+h+g+g)==n)
30                 {cout<<f<<h<<g<<g<<h<<f<<endl;
31         }    
32     }
33 }   
34  
35     return 0;
36 }

 


代码原文链接:https://blog.csdn.net/weixin_44503667/article/details/104321410

posted @ 2020-03-13 00:11  神楽桜KaguraSakura  阅读(833)  评论(0)    收藏  举报