你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言如何验证“6174数学黑洞之谜”?

[复制链接]
gaosmile 发布时间:2020-12-19 20:36
6174数学黑洞,即卡普雷卡尔(Kaprekar)常数。& w: R' `% r: z. }9 z
任选4个不完全相同的数字(像1111就不行),让“最大排列”减“最小排列”(例如8753-3578),不断重复这个动作,最后一定会得到相同的结果:6174。
4 i+ `/ k, d! e; Z4 v* s1 }
神奇的是:这个“最大减最小”的动作,最多不会超过7次!1 m. q0 E& }. c
! Y5 d& x9 j; Y% q/ {9 z
我们先来看看五组实验结果↓↓请输入一个互不相同的四位数:3758$ b2 d8 @0 p, V8 t# J2 X
输入的四位数是:3758/ g0 [% f+ e7 D0 o7 O
第1次:8753 - 3578 = 5175+ ^% f2 r# A- L3 c2 C# i
第2次:7551 - 1557 = 5994
! {/ w( [5 r' V第3次:9954 - 4599 = 53550 l- h/ R0 J, r; Y% z! l  v
第4次:5553 - 3555 = 1998
7 m6 q' }- C+ x$ G第5次:9981 - 1899 = 8082
. h2 ^: w$ q0 @% N. K' H第6次:8820 - 288 = 8532
8 \, R. x' V) {0 q& W. P8 {0 k) x$ Y第7次:8532 - 2358 = 6174
* l& Y, X: k8 s; b% x( x* ?经过了7次最大减最小的动作
: z1 O% a; @: O5 i- L5 m% m, Y
请输入一个互不相同的四位数:25174 s  W. k/ x) t# Q: o1 s' [
输入的四位数是:2517# w2 q$ X+ N9 ^/ Y! o' p& h
第1次:7521 - 1257 = 6264) ]/ |- ~, e: g8 a& f  K, V& Y
第2次:6642 - 2466 = 4176
' |/ z' F  c$ q4 c第3次:7641 - 1467 = 6174
: a2 V; P, m' N* n; R* b经过了3次最大减最小的动作4 Z9 e/ e  N# `1 q4 ?1 O8 \  G
请输入一个互不相同的四位数:6915: J" Q8 z2 r1 F/ |, L( E  K0 {% A
输入的四位数是:6915
8 n" t8 t$ p+ k" M' g  s$ w/ K7 q# [第1次:9651 - 1569 = 8082- ?5 U  q0 X7 o) R
第2次:8820 - 288 = 8532: j' B( T- }$ b* E- d
第3次:8532 - 2358 = 6174- m: ]5 B4 j% e: K! {0 q
经过了3次最大减最小的动作
) ?+ W' ~0 P% p1 b$ M7 h. ?
请输入一个互不相同的四位数:9073
- U8 ]3 b, u/ X8 p7 _( ?) h. P/ P+ [输入的四位数是:9073
: b  L. k% C; ?: ~第1次:9730 - 379 = 9351
7 E( h% O1 P, l+ o  ~0 G- g第2次:9531 - 1359 = 8172: n+ k: O/ y6 A
第3次:8721 - 1278 = 74435 F( `$ C0 [/ u# y
第4次:7443 - 3447 = 3996* F* W1 N2 d* g2 l
第5次:9963 - 3699 = 6264* ^; K' G2 g3 f; [. V! h
第6次:6642 - 2466 = 4176& A; m0 Q" u6 i1 w% J
第7次:7641 - 1467 = 6174& y. w4 u$ p" L2 D0 U
经过了7次最大减最小的动作+ D: P' i* @8 |% H& ]% P
请输入一个互不相同的四位数:5287
6 \" J6 }% J5 j, A6 `. f输入的四位数是:5287
% b4 ]! U+ I, r  l; g2 h' Y9 n& E第1次:8752 - 2578 = 6174
4 v% `% R9 H' J. }4 i6 O2 |经过了1次最大减最小的动作
( w" w1 D" H1 W+ i. i1 x

接下来,我们用C语言代码进行验证,代码实现如下。

代码实现#include <stdio.h>
% I& r# ~1 ^2 c- `- v
8 O3 P, D7 Z6 L% }) u, k' F. C4 Q5 zint convert(int number[],int ans);
1 j: C; @7 d! n, x9 ]1 F% Z4 h# o* @int *sort(int number[],int len);
$ K- ~9 _7 ]8 J# F* g8 U9 H5 {
9 T3 h8 E- n, z! ~1 G* Aint main(void)
; }( l+ z1 R- h/ x9 B+ F{4 B! \9 X, c* d  a3 F" Q
    int number[4] = {0};
, _- [7 }6 V9 @. Y; o3 W3 c, R+ o' r    int *p = NULL;
% }, j) |4 M8 o2 X* x9 ]    int n = 0;: R/ c3 ]  o" U9 ]% n  t& C
    int ans = 0;+ J7 f- M" T  e1 f. f. A( }5 M( y
    int count = 0;
9 }5 G0 _" l9 ?  _+ ^  H    printf("请输入一个互不相同的四位数:");3 @" i6 X* H5 m7 I% z: r
    scanf("%d",&n);9 Q" V3 i1 [' C. T
    printf("输入的四位数是:%d\n",n);
9 _! x, C$ ~7 \( ]7 H    ans = n;2 ~6 P! f* ^0 I6 g
    while(ans!=6174)
$ K, K2 ]5 P& Y# H4 L    {
1 ]( d# F* ]# `/ _, |        ans = convert(number,ans);' V5 A( Q( ?  X2 K/ P
        printf("第%d次:%d\n",count+1,ans);; ~7 x" ?1 z3 g) J: O
        ++count;9 _+ U1 G3 E( B+ x9 K& m
    }
4 g& v  _+ P  X  L, O4 U  k    printf("经过了%d次最大减最小的动作\n",count);  W. [3 N4 p* Y' b$ z9 D
    return 0;4 G9 q& E: H7 r2 ?& a9 R  @6 I
}
. X+ i! D+ e7 V1 Y! z3 S# {# p; t
' X* a# G% u, Nint *sort(int number[],int len) //大到小的排序  s4 x% ~+ m4 {, p# `1 G; f
{
5 G2 Y1 |- e. L# |    int a =0;
7 s  U# X; j. Q! ^6 M# k7 F- \- n    for(int i=0; i<len; ++i)9 C7 U! _4 e. \. V
    {
7 E. ~9 D& q! n- q$ k* K        for(int j=i+1;j<len;++j)) F4 |* b( w) a8 s8 Y
        {
: c( ~% A  ]2 a* V6 S& l            if(number <number[j])/ }1 ]  T) O8 ^& |% p# D0 Q
            {0 x+ O2 W8 g& z) }
                a = number;
# x0 f0 W, w$ P7 B7 t                number = number[j];% M/ F* V# {% X* Z8 s6 o% k* a* K; D/ ~
                number[j] = a;4 S& y9 N: W7 D% z
            }* |8 B& e" x" b$ O& \
        }
* Y% m( |5 y7 A  X* @    }
8 \, o8 W. F2 @' N" n! I- `    return number;
8 D( Z/ W9 Z' i/ P) F) v}
3 f7 u2 ^# S$ R; P$ nint convert(int number[],int ans)//每次变换得到的数字& B; S4 H$ k) v  Q& P
{0 x$ |# l+ m: j
    int *p = NULL;
' c" Y5 ?; y, m5 h  d/ W! n' s    int m=0;: V( i4 m1 Z- A" Q2 F4 s
    number[0] = ans/1000;  //把这个数放入数组& @% G6 `3 _9 ?, E& z/ _
    number[1] = ans%1000/100;
+ W' K8 b0 i1 n# m2 Y    number[2] = ans%100/10;
* O) i/ Q3 e7 `    number[3] = ans%10;
' Y" ^- _, r% g% d9 g6 O& a    p = sort(number,4);; o- t0 k+ g2 k) j% L  l: P
    m=(*p*1000+*(p+1)*100+*(p+2)*10+*(p+3))- ( *(p+3)*1000+*(p+2)*100+*(p+1)*10+*p);//最大数字减去最小数字
5 }* E% U' N1 _+ u% U    return m;$ ?3 D, t2 Z" x5 {/ ?/ Z/ S6 W
}
& @- g' z4 u8 C: `! o) O( G
运行结果: 微信图片_20201219203514.png 5 y9 G  V& D, u/ D- U
, t7 s4 m% d) T3 B9 C
赞 收藏 评论0 发布时间:2020-12-19 20:36

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版