J
来源:互联网 发布:如何用手机淘宝买东西 编辑:程序博客网 时间:2024/04/27 20:03
Description
任意一个4位自然数N(N不能是4个数字一样,如1111、2222、….9999是不可以的,N也不能是6174),将组成自然数N的4个数字重新排列,形成一个最大数和最小数,最大数和最小数相减,其差是还是自然数,将差的各数字再重新排列,又形成一个最大数和最小数,最大数和最小数相减,其差还是自然数。反复进行,直到差是一个神秘数6174(数学黑洞)结束。
Input
输入数据有多组,每组占一行,每行包含一个4位自然数N。输入文件直到EOF为止!
Output
对每组输入,输出有2行。第一行是所有差,以空格分隔,最后一个数后也有空格;第二行是差的个数。
Sample Input
100015003000
Sample Output
999 8991 8082 8532 617455085 7992 7173 6354 3087 8352 617472997 7173 6354 3087 8352 61746
解题思路:
此题为递归题,递归边界为差等于6147,若差不为此值,则对这个差进行递归
细节处理:
此处我用了vector向量将,用于存放当前数值的每位数(其实用个数组应该更简单),对于有些位数不足4位的,要放入0进行填充,最后通过升序排列再累乘,求出当前的差,对于vector向量来说要在每次递归结束后clear,
代码:
#include<iostream>//#include<bits/stdc++.h>#include<vector>#include<algorithm>using namespace std;int sum;void f(int m){int n=m;sum++;vector<int> a;while(n!=0){a.push_back(n%10);n=n/10;}if(a.size()==3)a.push_back(0);if(a.size()==2)for(int r=0;r<2;r++)a.push_back(0);if(a.size()==1) for(int r=0;r<3;r++)a.push_back(0);if(a.size()==0)for(int r=0;r<4;r++)a.push_back(0);sort(a.begin(),a.end());int max,min,cha;max=a[3]*1000+a[2]*100+a[1]*10+a[0];min=a[0]*1000+a[1]*100+a[2]*10+a[3];cha=max-min;if(cha==6174) {cout<<cha<<" ";;cout<<endl;cout<<sum<<endl;}else {cout<<cha<<" ";f(cha);}sum=0;a.clear();}int main(){int n;while(cin>>n){f(n);}return 0;}
0 0
- J
- j
- j
- J#
- J
- J
- J
- J
- j
- J
- J
- J
- J
- J
- J
- J
- J
- J
- 干掉状态:从session到token
- 虚拟仪器技术
- Linux系统入门学习:如何在树莓派上安装USB网络摄像头
- Pandas 文本数据方法 contains()
- oracle 10g 数据库与客户端冲突导致实例创建无监听问题
- J
- codeforces 547D Mike and Fish
- 【手把手教你树莓派3 (六)】使用 motion 和 mjpg 做视频监控器
- Jsp实现动态验证码(由5个类组成的gif动验证码)
- 背包问题01图文附带代码,非常清晰
- gdb学习
- C++知识文档三_类的定义和使用
- 树莓派3使用USB摄像头
- nyoj 1058 部分和问题(dfs+剪枝)