zoukankan      html  css  js  c++  java
  • 1019 数字黑洞

    给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。

    例如,我们从6767开始,将得到

    7766 - 6677 = 1089
    9810 - 0189 = 9621
    9621 - 1269 = 8352
    8532 - 2358 = 6174
    7641 - 1467 = 6174
    ... ...
    

    现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。

    输入格式:

    输入给出一个 ( 区间内的正整数 N。

    输出格式:

    如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000;否则将计算的每一步在一行内输出,直到 6174 作为差出现,输出格式见样例。注意每个数字按 4 位数格式输出。

    输入样例 1:

    6767
    

    输出样例 1:

    7766 - 6677 = 1089
    9810 - 0189 = 9621
    9621 - 1269 = 8352
    8532 - 2358 = 6174
    

    输入样例 2:

    2222
    

    输出样例 2:

    2222 - 2222 = 0000

    注意, 在change函数中必须确保是4位数, 否则可能会出现死循环, k是数字n的位数, 但不能把k当做change函数的参数(有的0也会起作用)

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int a[4], k;
    
    void divide(int n)
    {
    	for(int i = 0; i < 4; ++ i)
    	{
    		a[i] = 0;
    	}
    	while(n != 0)
    	{
    		a[k ++] = n % 10;
    		n /= 10;
    	}
    }
    
    int change1(int a[], int n)
    {
    	sort(a, a + n, greater<int>());
    	int p = a[0];
    	for(int i = 0; i < n - 1; ++ i)
    	{
    		p = p * 10 + a[i + 1];
    	}
    	return p;
    }
    
    int change2(int a[], int n)
    {
    	sort(a, a + n);
    	int p = a[0];
    	for(int i = 0; i < n - 1; ++ i)
    	{
    		p = p * 10 + a[i + 1];
    	}
    	return p; 
    }
    
    int main()
    {
    	int n, diff = 0, sub = 0, add = 0;
    	int flag = 0;
    	cin >> n;
    	
    	divide(n);
    	for(int i = 0; i < 3; ++ i)
    	{
    		if(a[i] != a[i + 1])	flag = 1;
    	}
    	
    	if(flag == 0)	
    	{
    		printf("%d - %d = 0000
    ", n, n);
    	}
    	else 
    	{
    		while(diff != 6174)
    		{
    			sub = change1(a, 4);
    			add = change2(a, 4);
    			diff = sub - add;
    			printf("%04d - %04d = %04d
    ", sub, add, diff);
    			k = 0;
    			divide(diff);
    		}
    	}
    	
    	return 0;
    } 
    

      简化一下代码

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
    	int n, a1, b1, a[5], b[5];
    	cin >> n;
    	
    	while(1)
    	{
    		for(int i = 0; i < 4; ++ i)
    		{
    			a[i] = n % 10;
    			b[i] = n % 10;
    			n /= 10;
    		}
    		sort(a, a + 4, greater<int>());
    		sort(b, b + 4);
    		
    		a1 = a[0]*1000 + a[1]*100 + a[2]*10 + a[3];
    		b1 = b[0]*1000 + b[1]*100 + b[2]*10 + b[3];
    		n = a1 - b1;
    		
    		printf("%04d - %04d = %04d
    ", a1, b1, n);
    		
    		if(n == 0)	break;
    		if(n == 6174)	break;
    	}
    	
    	return 0;
    }
    

      

  • 相关阅读:
    简简单单的 JavaScript简写技巧
    常用的前端小知识
    nuxt项目部署对静态页重编译问题
    docker 容器部署nuxt项目
    mysql数据库损坏修复问题
    storm supervisor和nimbus启动自动消失的问题
    MATLAB基础知识
    音视频入门-20-BMP、PNG、JPG、GIF静态图生成GIF动态图
    处理树状结构数据以及 React渲染
    React Hooks 获取最新数据问题
  • 原文地址:https://www.cnblogs.com/mjn1/p/10856413.html
Copyright © 2011-2022 走看看