专题06-7-4 6174问题

时间:2024-12-18 07:18:19

任务描述

著名的“6174黑洞”问题描述如下:
对于任意一个各位数字不全相同的4位正整数n,对n进行以下变换:把n所有的数字从大到小排序后得到整数a,
所有的数字从小到大排列后得到整数b,然后把a-b做为新的4位整数n,然后重复以上变换操作,直到得到6174,
然后便进入7641-1476=6174的陷阱(黑洞)。
(所有计算过程中如果得到4位以下的数,可以在整数左侧补0补足4位)

例如,从9998出发,依次可以得到
(第1次变换)9998-8999=0999
(第2次变换)9990-0999=8991
(第3次变换)9981-1899=8082
(第4次变换)8820-0288=8532
(第5次变换)8532-2358=6174
(以后进入黑洞,出不来)6174-6174=6174
经过5次变换后,得到6174。

再例如,从1234出发,依次可以得到
(第1次变换)4321-1234=3087、
(第2次变换)8730-0378=8352、
(第3次变换)8532-2358=6174、
(以后进入黑洞,出不来)6174-6174=6174
经过3次变换后,得到6174。

也就是说,对于任意一个各位数字不全相同的4位正整数n经过若干步骤计算,最终会是到6174,并陷入6174的轮回!这就是数学上著名的6174黑洞问题。

现在要你写一个程序来输出一个四位数要经过多少次这样的变换能得到6174,比如
对于输入1234,应该输出3,对于输入9998,应该输出5。

输入格式:
第一个整数k,代表有k组测试数据。接下来是k个4位整数(保证4位数字不全相同)。

输出格式:
每行输出一个整数,代表一组数据的结果。

输入样例:
2 1234 9998
输出样例:
3
5


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int Judge(int x)
{
    int flag = 1, sum = 0;
    for (int i = 2; i <=x / 2; i++)
    {
        for (int j = 2; j < i; j++)
        {
            flag = 1;
            if (i % j==0)
            {
                flag = 0;
                break;
            }
        }
        if (flag)
        {
            for (int j = 2; j <= (x - i)/j; j++)
            {
                if ((x - i) % j == 0)
                {
                    flag = 0;
                    break;
                }
            }
        }
        if (flag)
        {
            sum++;
        }
    }
    return sum;
}

int main()
{
    int tmp;
    while (1)
    {
        scanf("%d", &tmp);
        if (tmp)
            printf("%d\n", Judge(tmp));
        else
            break;
    }
    return 0;
}