用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


__EOF__

本文作者神楽桜KaguraSakura
本文链接https://www.cnblogs.com/KaguraSakura/p/12483873.html
关于博主:hello~好久不见,喜欢的话点个赞吧
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神楽桜KaguraSakura  阅读(803)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示