“数学黑洞”——递归

题目如下:任意一个4位自然数(要求此4位自然数各位数字不能完全相同,如4444不合题意),将组成该数的各位数字重新排列,形成一个最大数和一个最小数,用最大数减去最小数,即max-min,得到另一个4位的自然数。接下来,在对所得自然数重复上述操作,直到得到一个神秘的数字——6174: 这个数字“6174”也被称为“卡普耶卡常数”
证明详见点击打开链接
代码如下:

(用户输入一个四位数,输出变换到6174的过程)

#include <iostream>
#include <algorithm>
using namespace std;

int f(int n);

int main()
{
	int n, m;
	while (cin >> n && n)
	{
		cout << f(n) << endl;
	}
	return 0;
}

int f(int n)
{
	if (n == 6174) // 递归结束条件
	   return n;
	int a[4] = {0};
	for(int i=0; n > 0; i++) 
	{
	    a[i] = n % 10;
	    n/=10;
        }
        sort(a, a + 4); // 将数组a中的元素从大到小排序
	int maxn = a[0] + a[1] * 10 + a[2] * 100 + a[3] * 1000;
	int minn = a[3] + a[2] * 10 + a[1] * 100 + a[0] * 1000;
	n =  maxn - minn;
	cout << n << endl;
	return f(n); // 递归
}



版权声明:本文为qq_41705423原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。