数字黑洞(C语言、C++)

题目描述
任意一个四位正整数(4位数字相同者除外), 将各位数字组成一个最大数和最小数,两数相减并重复这一过程必得6174。

输入格式
输入一个四位正整数。

输出格式
输出文件包含多行, 组成一个最大数和一个最小数就输出一行,直道结果为6174。

样例
输入数据 1
4123
输出数据 1
4321-1234=3087
8730-378=8352
8532-2358=6174

那就做一个函数专门拆解整数,得到最大数和最小数,然后不断按照规则循环,直到获得6174

#include <stdio.h>
void func(int n,int *max,int *min)
{
    int a[4],i,j,t;
    a[0] = n/1000;
    a[1] = n%1000/100;
    a[2] = n%100/10;
    a[3] = n%10;
    for(i=0;i<3;i++)
        for(j=0;j<3-i;j++)
        {
            if(a[j] < a[j+1])
            {
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    *max = 0;
    for(i=0;i<4;i++)
        *max = *max * 10 + a[i];
    *min = 0;
    for(i=3;i>=0;i--)
        *min = *min * 10 + a[i];

}
int main()
{
    int n,max,min;
    scanf("%d",&n);
    while(n!=6174)
    {
        func(n,&max,&min);
        printf("%d-%d=%d\n",max,min,max-min);
        n=max-min;
    }
    return 0;
}

先诸位拆出各位数字,然后排序,重新组合成最大数和最小数,计算差,直到结果为6174
运行结果:

img

代码:

#include <stdio.h>
void bubblesort(int a[], int n)
{
    int i, j, t;
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (a[j] > a[j + 1]) //从小到大排序
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
}

int main()
{
    int a[4];
    int max, min;
    int n, i = 0, j;
    int res ;
    scanf("%d", &n); //读取n
    res = n;
    
    while (res != 6174)
    {
        i = 0;
        //得到各位数字
        while (n)
        {
            a[i] = n % 10;
            n /= 10;
            i++;
        }
        //排序
        bubblesort(a, 4);
        //得到最大数和最小数
        min = 0;
        for (i = 0; i < 4; i++)
            min = min * 10 + a[i];
        max = 0;
        for (j = 3; j >= 0; j--)
            max = max * 10 + a[j];

        if (max == min)
        {
            printf("四位数字相等,不符合要求!\n");
            return 0;
        }
        res = max - min;
        printf("%d-%d=%d\n", max, min, res);
        n = res;
    }
    return 0;
}

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/1097518
  • 除此之外, 这篇博客: C与C++程序设计学习笔记中的 8、一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数。比如121,2332 都是回文数,13,4567不是回文数。任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得到一个新的数,如果新数不是回文数,重复这个变换,直到得到一个回文数为止。例如,57变换后得到132(57 + 75),132得到363(132 + 231)),363是一个回文数。曾经有数学家猜想:对于任意正整数,经过有限次上述变换以后,一定能得出一个回文数。至今这个猜想还没有被证明是对的。现在请你通过程序来验证。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 输入一行一个正整数n。

    输出第一行一个正整数,表示得到一个回文数的最少变换次数。
    接下来一行,输出变换过程,相邻的数之间用"—>"连接。输出格式可以参见样例。
    保证最后生成的数在int范围内。

    349
    
    3
    349--->1292--->4213--->7337
    
    #include <stdio.h>
    #include <math.h>
    int isPalindrome(int x) //如果传入的正整数是回文数则返回1,否则返回0
    {
    	if (x < 0) return 0;
    	else if (x == 0) return 1;	
    	else
    	{
    		int i = 0, j = 0, a[100] = { 0 };
    		while (x > 0)
    		{
    			a[i] = x % 10;
    			i++;
    			x = x / 10;
    		}
    		for (j = 0; j <= (i - 1) / 2; j++)
    		{
    			if (a[j] != a[i - 1 - j]) return 0;
    		}
    		return 1;
    	}
    }
    int fz(int x) //返回翻转后的正整数
    {
    	int a[100] = { 0 }, i = 0, y = 0, j = 0;
    	while (x > 0)
    	{
    		a[i] = x % 10;
    		i++;
    		x = x / 10;
    	}
    	i--;
    	for (j = 0; j <= i; j++)
    	{
    		y += a[j] * pow(10, i - j);
    	}
    	return y;
    }
    int main(void)
    {
    	int k = 0, i = 0, a[100] = { 0 }, j = 0;
    	scanf("%d", &k);
    	while (isPalindrome(k) == 0)
    	{
    		a[i] = k;
    		k += fz(k);
    		i++;
    	}
    	printf("%d\n", i);
    	for (j = 0; j < i; j++)
    	{
    		printf("%d--->", a[j]);
    	}
    	printf("%d", k);
    	return 0;
    }
    

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632