注册 登录
编程论坛 C++教室

黑洞数

return_0 发布于 2020-02-07 13:13, 6556 次点击
我拿二十分急求助!
495是一个具有奇特性质的三位数,被称之为黑洞数。它的性质如下:

首先,任取一个十进制下的三位数,如122122或者346346等,但三个数字完全相等的三位数除外。如不能选择333333或888888
其次,把各位数字按大到小的顺序和小到大的顺序重新排列,两者相减,将会得到另一个四位数。
例如,取260260,重新排列后最大数为620620,最小数为026026,620-026=594620−026=594
重复以上过程若干遍,最后一定会得到495495
例如,对上一步的数字594594再做一次变换,得到954-459=495954−459=495
举个更加复杂的例子:

343 \rightarrow 099 \rightarrow 891 \rightarrow 792 \rightarrow 693 \rightarrow 594 \rightarrow 495343→099→891→792→693→594→495

现在给定一个正整数nn,请你输出nn掉落到黑洞中的过程。需要说明的是,不足三位数的整数,只要在最高位补00,最后也会落到黑洞里。

输入格式

第一行:单个正整数nn

输出格式

若干行:每行代表一次变换过程,详见样例

数据范围

1\leq n<10001≤n<1000,保证nn的三位数字不完全相同

例子
Input
23
复制一下
Output
320-023=297
972-279=693
963-369=594
954-459=495
复制一下
例子
Input
998
复制一下
Output
998-899=099
990-099=891
981-189=792
972-279=693
963-369=594
954-459=495
复制一下
37 回复
#2
return_02020-02-07 15:38
hello
#3
叶纤2020-02-07 22:59
程序代码:
#include<iostream>
using namespace std;
void hedong(int n)
{   while(n!=0&&n!=495)
    {
        int a[]= {n/100%10,n/10%10,n/1%10};
        for(int i=1; i!=3; ++i)
        {   for(int j=i-1; i>0&&a[j]<a[j+1]; --j)
            {   int tem=a[j];
                a[j]=a[j+1];
                a[j+1]=tem;
            }
        }
        /*for(int i=0;i!=3;++i)
        {cout << a[i] ;}
*/
        int ah=a[0]*100+a[1]*10+a[2]*1;
        int b=a[2]*100+a[1]*10+a[0]*1;
        n=ah-b;
        cout <<ah <<"-" << b<<"="<<n<<'\n';
    }
}
int main()
{   int n{} ;
    cin >> n;
    hedong(n);

}  

//因为是匆忙写出来的可能有地方没考虑到
#4
xianfajushi2020-02-08 09:05
可参https://blog.
#5
wmf20142020-02-08 09:35
有点意思。不由得好奇除了3位数,更多位数会不会有黑洞数呢?借用3楼的函数名写了个整型数范围内的测试(大概最多测试到8位吧),发现仅3位和4位整数最终会落入黑洞数,其他的会落入不定的一段数内循环,代码如下:
程序代码:
#include<iostream>
using namespace std;
void  hedong(int n,int *b)
{
    int i, j=1, k, l, a[10] = { 0 };
    for (i=n; i; i /= 10)a[i % 10]++;
    for (i = k = l = 0; i < 10; i++)
    {
        for (; a[i]; a[i]--)
        {
            k = k * 10 + i;
            l = i*j+l;
            j *= 10;
        }
    }
    j = l - k;
    cout << l << '-' << k << '=' << j << endl;
    if (!j)return;
    for (i = 0; b[i]; i++)if (j == b[i])return;
    b[i] = j;
    hedong(j,b);
}
int main()
{
    int i,n,b[100];
    while (cout<<"数据输入(0退出):",cin >> n && n)  
    {
        for (i = 0; i < 100; i++)b[i] = 0;
        hedong(n, b);
    }
}
#6
xianfajushi2020-02-08 10:11
稍加修改即可实现本题https://blog.bccn.net/xianfajushi/66961
只有本站会员才能查看附件,请 登录
#7
xianfajushi2020-02-08 10:11
稍加修改即可实现本题https://blog.bccn.net/xianfajushi/66961
只有本站会员才能查看附件,请 登录
#8
叶纤2020-02-08 10:41
回复 5楼 wmf2014
代码语言太高级了,难懂

[此贴子已经被作者于2020-2-8 11:06编辑过]

#9
叶纤2020-02-08 10:50
回复 7楼 xianfajushi
吐槽一下::发图就发图吧,为什么您的图上还有日历,主要是图上只有测试,没有代码,想看您优化后的代码都做不到,
建议,把代码贴上来就行,让后辈可以学习一下
#10
叶纤2020-02-08 11:01
回复 7楼 xianfajushi
您这样做,新手即使登入您的博客也会感觉看不懂而已,并不能起到学习作用,只能感觉您太保护自己的知识产权了(我这人说话一向很直白请版主见谅)
#11
xianfajushi2020-02-08 11:12
有偏见了吧,如果要保护自己代码就不写博客了,写出来就是给人看的。
以下是引用叶纤在2020-2-8 11:01:49的发言:

您这样做,新手即使登入您的博客也会感觉看不懂而已,并不能起到学习作用,只能感觉您太保护自己的知识产权了(我这人说话一向很直白请版主见谅)

#12
叶纤2020-02-08 11:27
我知道您是在为广大新手考虑希望大家能通过您的代码能学习到东西
我也为您考虑新手并不能看懂您汉字加英文加符号版的代码,您的育人目的达不到,所以我也是为您能达成这一目的而考虑,希望您能改写代码风格,为以后万万个新手考虑,您是他们的老师,可是学生看不懂老师的代码或听不懂老师的话,这是多么的悲哀,(你可以骂我没事找事干,我统统接受,如果这声骂能换来未来万万名新手的学习,我觉得值)
#13
叶纤2020-02-08 11:29
以下是引用xianfajushi在2020-2-8 10:11:25的发言:

稍加修改即可实现本题https://blog.bccn.net/xianfajushi/66961

我也引用你的帖子吧
#14
xianfajushi2020-02-08 11:35
出于好奇,翻出以前写的代码。更多位数?稍修改也试看
程序代码:

    int shu = 4, shuan = shu;
    while (++shuan < INT_MAX)
    {
        while ((shuan = 数重组位最大(shuan)) != 495 && shuan);
        shuan = ++shu; cout << endl;
    }

只有本站会员才能查看附件,请 登录

以下是引用wmf2014在2020-2-8 09:35:18的发言:

有点意思。不由得好奇除了3位数,更多位数会不会有黑洞数呢?借用3楼的函数名写了个整型数范围内的测试(大概最多测试到8位吧),发现仅3位和4位整数最终会落入黑洞数,其他的会落入不定的一段数内循环,代码如下:

#15
xianfajushi2020-02-08 11:35
出于好奇,翻出以前写的代码。更多位数?稍修改也试看
程序代码:

    int shu = 4, shuan = shu;
    while (++shuan < INT_MAX)
    {
        while ((shuan = 数重组位最大(shuan)) != 495 && shuan);
        shuan = ++shu; cout << endl;
    }

只有本站会员才能查看附件,请 登录

以下是引用wmf2014在2020-2-8 09:35:18的发言:

有点意思。不由得好奇除了3位数,更多位数会不会有黑洞数呢?借用3楼的函数名写了个整型数范围内的测试(大概最多测试到8位吧),发现仅3位和4位整数最终会落入黑洞数,其他的会落入不定的一段数内循环,代码如下:

#16
wmf20142020-02-08 11:40
回复 8楼 叶纤
没用什么很复杂的算法,主要是用了计数排序和递归,递归退出条件是出现重复数或0.代码都是些基础代码,在vs2017中编译通过。
测试运行图如下:
只有本站会员才能查看附件,请 登录

#17
wmf20142020-02-08 11:44
回复 15楼 xianfajushi
建议你百度下“黑洞数”,四位数最终是落入6174这个数,而不是三位数的495.
#18
xianfajushi2020-02-08 11:54
用多位数运算,似乎出现了另一个黑洞数
只有本站会员才能查看附件,请 登录
#19
xianfajushi2020-02-08 11:54
用多位数运算,似乎出现了另一个黑洞数
只有本站会员才能查看附件,请 登录
#20
叶纤2020-02-08 11:56
回复 15楼 xianfajushi
这张图给的才给力,四位数终于知道怎么计算了,我改改代码去,谢谢喽,
#21
xianfajushi2020-02-08 12:09
我一向主张初学者可以使用母语编程,有诸多好处,当要与外国人合作时才用合作的,莫学冥顽不灵的观点或论调。
以下是引用叶纤在2020-2-8 11:27:35的发言:

我知道您是在为广大新手考虑希望大家能通过您的代码能学习到东西
我也为您考虑新手并不能看懂您汉字加英文加符号版的代码,您的育人目的达不到,所以我也是为您能达成这一目的而考虑,希望您能改写代码风格,为以后万万个新手考虑,您是他们的老师,可是学生看不懂老师的代码或听不懂老师的话,这是多么的悲哀,(你可以骂我没事找事干,我统统接受,如果这声骂能换来未来万万名新手的学习,我觉得值)



[此贴子已经被作者于2020-2-8 12:10编辑过]

#22
xianfajushi2020-02-08 12:20
这样写似乎可以发现不同的黑洞数,又出现了
程序代码:

    int shu = 4, shuan = shu, p = 0;
    while (++shuan < INT_MAX)
    {
        p = 0;
        while ((shuan = 数重组位最大(shuan)), shuan != 495 && shuan != 6174 && shuan);//if (++p >= 444)break
        shuan = ++shu; cout << endl;
    }

只有本站会员才能查看附件,请 登录
#23
xianfajushi2020-02-08 12:20
这样写似乎可以发现不同的黑洞数,又出现了
程序代码:

    int shu = 4, shuan = shu, p = 0;
    while (++shuan < INT_MAX)
    {
        p = 0;
        while ((shuan = 数重组位最大(shuan)), shuan != 495 && shuan != 6174 && shuan);//if (++p >= 444)break
        shuan = ++shu; cout << endl;
    }

只有本站会员才能查看附件,请 登录
#24
叶纤2020-02-08 12:33
以下是引用xianfajushi在2020-2-8 12:09:37的发言:

我一向主张初学者可以使用母语编程,有诸多好处,当要与外国人合作时才用合作的,莫学冥顽不灵的观点或论调。

有母语编程啊
程序代码:
  

.子程序 __启动窗口_创建完毕

.局部变量 arr, 整数型, , "10"

.局部变量 n, 整数型

.局部变量 i, 整数型

.局部变量 t, 整数型

' //冒泡排序,从小到大

arr = { 89, 56, 34, 48, 57, 62, 74, 85, 93, 105 }

.变量循环首 (1, 10, 1, n)

  .变量循环首 (1, 10 - n, 1, i)

    .如果真 (arr [i] > arr [i + 1])

      t = arr [i]

      arr [i] = arr [i + 1]

      arr [i + 1] = t

    .如果真结束

  .变量循环尾 ()

.变量循环尾 ()

.变量循环首 (1, 10, 1, i)

  编辑框1.内容 = 编辑框1.内容 + “ ” + 到文本 (arr [i])

.变量循环尾 ()
   
这个是易语言,我能看懂这个。 。。
#25
xianfajushi2020-02-08 13:07
目前对易语言不感兴趣,除非我国自己开发一套系统,我国自己开发一套编译器,封装的实在没兴趣。
我国一定要有自己的电脑操作系统,就像有了公交也要有自己的轿车一样,自己的就是自己的,别人的终归别人。
修改了一下程序,好似可以用于分析新的黑洞数
程序代码:

    int shu = 4, shuan = shu, p = 0;
    while (++shuan < INT_MAX)
    {
        p = 0;
        while ((shuan = 数重组位最大(shuan)), shuan != 495 && shuan != 6174 && shuan)if (++p >= 444)system("pause");
        shuan = ++shu; cout << endl;
    }

只有本站会员才能查看附件,请 登录
#26
xianfajushi2020-02-08 13:07
目前对易语言不感兴趣,除非我国自己开发一套系统,我国自己开发一套编译器,封装的实在没兴趣。
我国一定要有自己的电脑操作系统,就像有了公交也要有自己的轿车一样,自己的就是自己的,别人的终归别人。
修改了一下程序,好似可以用于分析新的黑洞数
程序代码:

    int shu = 4, shuan = shu, p = 0;
    while (++shuan < INT_MAX)
    {
        p = 0;
        while ((shuan = 数重组位最大(shuan)), shuan != 495 && shuan != 6174 && shuan)if (++p >= 444)system("pause");
        shuan = ++shu; cout << endl;
    }

只有本站会员才能查看附件,请 登录
#27
xianfajushi2020-02-08 13:15
又有了
只有本站会员才能查看附件,请 登录
#28
xianfajushi2020-02-08 13:15
又有了
只有本站会员才能查看附件,请 登录
#29
叶纤2020-02-08 13:20
以下是引用xianfajushi在2020-2-8 13:07:27的发言:

目前对易语言不感兴趣,除非我国自己开发一套系统,我国自己开发一套编译器,封装的实在没兴趣。
我国一定要有自己的电脑操作系统,就像有了公交也要有自己的轿车一样,自己的就是自己的,别人的终归别人。
修改了一下程序,好似可以用于分析新的黑洞数

    int shu = 4, shuan = shu, p = 0;
    while (++shuan < INT_MAX)
    {
        p = 0;
        while ((shuan = 数重组位最大(shuan)), shuan != 495 && shuan != 6174 && shuan)if (++p >= 444)system("pause");
        shuan = ++shu; cout << endl;
    }
您说的都对,别发了,出于我对于您的尊重我会选择回帖,所以,您还是停止回帖吧,要不咱俩的聊天10页都不够用
#30
xianfajushi2020-02-08 13:32
彼此彼此;
来讨论黑洞数,看发的一些图是否说明可以用于分析?

[此贴子已经被作者于2020-2-8 13:35编辑过]

#31
return_02020-02-08 14:05
我试样例试出来如下:
823
832-238=594
54-450=-396
-369--963=594
954-459=495
#32
叶纤2020-02-08 14:14
那你用我的吧
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
应该不会出现负数,可能还需要加强一下
#33
xianfajushi2020-02-09 20:10
https://blog.bccn.net/xianfajushi/66963
设计一个自动分析黑洞数并添加到判断中的程序,初测运行正常,如百度百科中列出的495,6174都正确自动识别添加到判断队列,以下是程序,欢迎测试,指正。
#34
xianfajushi2020-02-10 08:19
练习编程,顺手写了黑洞数123
程序代码:

void 黑洞数123(int 整数)
{
    int 偶 = 0, 奇 = 0, 位 = 0, 数 = 整数;
    while (数 != 123)
    {
        cout << 数 << "->";
        while (数)if (数 % 10 % 2)++奇, ++位, 数 /= 10; else ++偶, ++位, 数 /= 10;
        数 = 偶 * 100 + 奇 * 10 + 位;
        if (数 < 100)数 *= 10;
        偶 = 奇 = 位 = 0;
        cout << 数 << ends;
    }
    cout << endl;
}

    int 整数 = 100;
    while (整数<400)黑洞数123(整数++);

只有本站会员才能查看附件,请 登录
#35
xianfajushi2020-02-10 08:19
练习编程,顺手写了黑洞数123
程序代码:

void 黑洞数123(int 整数)
{
    int 偶 = 0, 奇 = 0, 位 = 0, 数 = 整数;
    while (数 != 123)
    {
        cout << 数 << "->";
        while (数)if (数 % 10 % 2)++奇, ++位, 数 /= 10; else ++偶, ++位, 数 /= 10;
        数 = 偶 * 100 + 奇 * 10 + 位;
        if (数 < 100)数 *= 10;
        偶 = 奇 = 位 = 0;
        cout << 数 << ends;
    }
    cout << endl;
}

    int 整数 = 100;
    while (整数<400)黑洞数123(整数++);

只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-2-10 12:13编辑过]

#36
黑色电视剧2020-02-12 08:49
#include<iostream>
using namespace std;
void  hedong(int n,int *b)
{
    int i, j=1, k, l, a[10] = { 0 };
    for (i=n; i; i /= 10)a[i % 10]++;
    for (i = k = l = 0; i < 10; i++)
    {
        for (; a[i]; a[i]--)
        {
            k = k * 10 + i;
            l = i*j+l;
            j *= 10;
        }
    }
    j = l - k;
    cout << l << '-' << k << '=' << j << endl;
    if (!j)return;
    for (i = 0; b[i]; i++)if (j == b[i])return;
    b[i] = j;
    hedong(j,l
);
}
int main()
{
    int i,n,b[100];
    while (cout<<"数据输入(0退出):",cin >> n && n)  
    {
        for (i = 0; i < 100; i++)b[i] = 0;
        hedong(n, b);
    }
#37
return_02020-03-03 08:31
回复 36楼 黑色电视剧
你main后面下括号漏了
#38
return_02020-03-03 08:52
还有,你的l不是指针变量,编译时会出错
1