有意思的数学问题

任意4位不完全一样的数字,能组合出的最大数字减去能组合出的最小数字,得到一个新的数字(3位数补0),重复以上操作,不超过7个循环,必然得到一个数:6174

这个问题是之前发布的文章,有读者朋友在文章留言提到这个,我觉得比较有意思,就拿出来分享,最近迷上这类有意思的东西,而且是热乎原创的。

1、我写的代码

刚开始写的第一份代码,有个缺陷,写完后看到另一个读者提交的答案,已经考虑到了这个问题,自我感觉,大神还是挺多的。

我说下我代码里面的几个重点

1、我使用get来获取输入的字符,所以呢,再使用arr[i] - 0x30把ascii码转换成数字,比如字符 1转换成数字1,就需要把字符1对应的值0x31减去0x30得到数字1。

2、关于冒泡排序,冒泡排序网上有很多讲解,第一个for循环是从0开始到len-1结束的,关键在于第二个for循环,第二个for循环从第一个for循环的值的下一个位置开始到len结束。

关于冒泡排序的思路,我做了一组图示,如附图1#include "stdio.h"

#include "stdbool.h"

/*判断数组里面是否有一样的数*/

int j(char *arr,int len){

int i,j;

for(i=0;i

arr[i] = arr[i] - 0x30;/*字符转成数字*/

for(i=0;i

for(j=i+1;j

if(arr[i] == arr[j])

return false;

return true;

}

/*判断是否不足够4位数字*/

int j2(int diff){

if(diff<10){

diff=diff*1000;

}else if(diff<100){

diff = diff*100;

}else if(diff<1000){

diff=diff*10;

}

}

/*升序*/

int m(char *arr,int len){

int i,j;

for(i=0;i

for(j=i+1;j

if( arr[i]

arr[i] ^= arr[j];

arr[j] ^= arr[i];

arr[i] ^= arr[j];

}

}

/*降序*/

int n(char *arr,int len){

int i,j;

for(i=0;i

for(j=i+1;j

if( arr[i] > arr[j]){

arr[i] ^= arr[j];

arr[j] ^= arr[i];

arr[i] ^= arr[j];

}

//printf("%d%d%d%d\n",arr[0],arr[1],arr[2],arr[3]);

}

int main(void){

int dmax,dmin,diff,i;

char nums[4];

char max[4];

char min[4];

/*输入4个不同的数字*/

while(j(nums,4) == false)

{

printf("input:");

gets(nums);

}

/*7个循环进行判断*/

for(i=0;i<7;i++)

{

/*排序*/

m(nums,4);

//printf("%d%d%d%d\n",nums[0],nums[1],nums[2],nums[3]);

dmax = nums[0]*1000 + nums[1]*100+nums[2]*10+nums[3];

/*排序*/

n(nums,4);

//printf("%d%d%d%d\n",nums[0],nums[1],nums[2],nums[3]);

dmin = nums[0]*1000 + nums[1]*100+nums[2]*10+nums[3];

diff = dmax - dmin;

diff = j2(diff);

printf("dmax:%d dmin:%d diff:%d\n",dmax,dmin,diff);

if(diff == 6174){

printf("find 6174\n");

break;

}

nums[0] = diff/1000;

nums[1] = diff%1000/100;

nums[2] = diff%1000%100/10;

nums[3] = diff%10;

}

getchar();

return (0);

}

代码输出input:1234

dmax:4321 dmin:1234 diff:3087

dmax:8730 dmin:378 diff:8352

dmax:8532 dmin:2358 diff:6174

find 6174

基于严谨性,我写了个测试程序来检验我的这段代码,我总是觉得这样的理论不可思议,用一个数字是不可能代表所有的可能性的,所以有了下面的这段代码。#include "stdio.h"

#include "stdbool.h"

#include "time.h"

/*判断数组里面是否有一样的数*/

int j(char *arr,int len){

int i,j;

for(i=0;i

arr[i] = arr[i] - 0x30;/*字符转成数字*/

for(i=0;i

for(j=i+1;j

if(arr[i] == arr[j])

return false;

return true;

}

/*判断是否不足够4位数字*/

int j2(int diff){

if(diff<10){

diff=diff*1000;

}else if(diff<100){

diff = diff*100;

}else if(diff<1000){

diff=diff*10;

}

}

/*升序*/

int m(char *arr,int len){

int i,j;

for(i=0;i

for(j=i+1;j

if( arr[i]

arr[i] ^= arr[j];

arr[j] ^= arr[i];

arr[i] ^= arr[j];

}

}

/*降序*/

int n(char *arr,int len){

int i,j;

for(i=0;i

for(j=i+1;j

if( arr[i] > arr[j]){

arr[i] ^= arr[j];

arr[j] ^= arr[i];

arr[i] ^= arr[j];

}

//printf("%d%d%d%d\n",arr[0],arr[1],arr[2],arr[3]);

}

/******************************************************************************

*函数名称:void get_random(char * random)

*函数功能:产生一个各位数不相等的四位随机数

*入口参数:random为返回的随机数

*返 回 值:无

*备 注:先生成一个0-9的整数数组,再随机从中取四个数,每取一个将该位置为-1

*******************************************************************************/

void get_random(char * random){

int i, j[10], k;

for (i = 0; i

j[i] = i;

}

for(i = 0; i

//生成第i个随机数

k = (int)rand() % 10;//k为下标

while (j[k] == -1){

k = (k + 1) % 10;

}

random[i] = '0' + j[k];

j[k] = -1;

}

}

int main(void){

int dmax,dmin,diff,i,r,count;

long t;

char nums[4],max[4],min[4];

srand((unsigned)time(&t));

for(count = 0;count <10000;count++){

get_random(nums);

printf("%c%c%c%c\n",nums[0],nums[1],nums[2],nums[3]);

for(i=0;i<7;i++){

m(nums,4);

dmax = nums[0]*1000 + nums[1]*100+nums[2]*10+nums[3];

n(nums,4);

dmin = nums[0]*1000 + nums[1]*100+nums[2]*10+nums[3];

diff = dmax - dmin;

diff = j2(diff);

if(diff == 6174){

printf("find 6174 %d\n",count);

break;

}

if(i == 6 && diff != 6174)

goto error;

nums[0] = diff/1000;

nums[1] = diff%1000/100;

nums[2] = diff%1000%100/10;

nums[3] = diff%10;

}

}

getchar();

return (0);

error:

printf("Can't find 6174 %d\n",count);

getchar();

return (0);

}

我在代码里面测试了 10000 次数据,意思就是我输入10000个不同的数据,来测试是不是结果都是6174,结果确实是这样。

代码输出,因为输出比较多,我只截取了最后的一些find 6174 9985

9802

find 6174 9986

5908

find 6174 9987

3127

find 6174 9988

9124

find 6174 9989

5027

find 6174 9990

5304

find 6174 9991

7864

find 6174 9992

8213

find 6174 9993

4795

find 6174 9994

0184

find 6174 9995

2410

find 6174 9996

2134

find 6174 9997

5340

find 6174 9998

3294

find 6174 9999

2、有个读友提供的代码

基本思路都差不多,而且里面用到的排序思路都是一样的。#include

int getMax(int byte[]){

int max;

for(int i=0;i<3;i++){

for(int j=i+1;j<4;j++){

if(byte[i]

int t=byte[i];

byte[i] = byte[j];

byte[j] = t;

}

}

}

// printf(" sort byte is  %d  %d  %d  %d\n",byte[0],byte[1],byte[2],byte[3]);

// printf("<<<<<<<<<<<<<<<<

max = byte[0]*1000+byte[1]*100+byte[2]*10+byte[3];

return max;

}

int getMin(int byte[]){

int min;

for(int i=0;i<3;i++){

for(int j=i+1;j<4;j++){

if(byte[i]>byte[j]){

int t=byte[i];

byte[i] = byte[j];

byte[j] = t;

}

}

}

// printf(" sort byte is  %d  %d  %d  %d\n",byte[0],byte[1],byte[2],byte[3]);

// printf(">>>>>>>>>>>>>>>>>\n");

min = byte[0]*1000+byte[1]*100+byte[2]*10+byte[3];

return min;

}

int main(){

int a = 0;

printf("input the num :\n");

int max;

int min;

scanf("%d",&a);

for(int i=0;i<7;i++){

printf("the num:%d\n",a);

if(a<10){

a=a*1000;

}

else if(a<100){

a = a*100;

}else if(a<1000){

a=a*10;

}

printf("deal num:%d\n",a);

int byte[4]={0};

byte[0]=a/1000;

byte[1]=a/100%10;

byte[2] = a/10%10;

byte[3] = a%10;

// printf(">>>>>>>>>>>>>>>>>\n");

// printf("byte is  %d  %d  %d  %d\n",byte[0],byte[1],byte[2],byte[3]);

if(a == 6174){

printf("bingo!!!\n");

break;

}

max = getMax(byte);

min = getMin(byte);

printf("the max:%d\n",max);

printf("the min:%d\n",min);

a=max-min;

}

return 0;

}

代码运行输出weiqifa@bsp-ubuntu1804:~/c$ gcc 6174.c && ./a.out

input the num :

1234

the num:1234

deal num:1234

the max:4321

the min:1234

the num:3087

deal num:3087

the max:8730

the min:378

the num:8352

deal num:8352

the max:8532

the min:2358

the num:6174

deal num:6174

bingo!!!

weiqifa@bsp-ubuntu1804:~/c$

附图1

6174C语言编程,C语言验证6174数学问题相关推荐

  1. 6174C语言编程,C语言代码实现:6174数学黑洞(卡普雷卡尔常数)

    1:6174数学黑洞现象 ,即常数. 任选4个不完全相同的数字(,如1111就不行),让减(例如8753-3578),不断重复这个动作,最后一定会得到相同的结果:. 神奇的是:这个"最大减最 ...

  2. 11 12 13c语言编程,C语言编程

    C语言编程 1.sscanf() sscanf()与scanf()类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源. 头文件:#include 格式:int ssc ...

  3. 0.618法C语言编程,c语言编程题--0.618法求最小值

    c语言编程题--0.618法求最小值0 题目: 1.函数f(x)=x+10/x,初始量a=2,b=10,c=0.3 2.步骤:(1)取a1=a+0.382*(b-a),b1=b+0.618*(b-a) ...

  4. 100以内加减法C语言编程,C语言编程100题(其三)来啦!

    原标题:C语言编程100题(其三)来啦! 无论是风里,还是在雨里,我都在这里守候着你- 大家好啊,我是小C,咱们又见面咯,前面的题目做的怎么样呢,今天又给大家送上新的题目了,快来学习吧! 计算200到 ...

  5. 在线模拟c语言编程,c语言模拟编程学习软件v2019

    C/C ++程序设计学习与实验系统是一款可用于设计教学演示.学习与实验的C/C ++语言编程学习软件,是由从事教学的老师根据C/C ++的初学者及C程序多媒体演示研发.对于想要学习C语言的朋友是一个不 ...

  6. [Lua语言编程]Lua语言基础知识

    文章目录 `Lua` `Lua`语言的起源 `Lua` 特性 `Lua下载` Linux 系统上安装 Mac OS X 系统上安装 Window 系统上安装 `Lua` `Lua`语言语法 `Lua` ...

  7. C语言验证6174数学问题

    有意思的数学问题 任意4位不完全一样的数字,能组合出的最大数字减去能组合出的最小数字,得到一个新的数字(3位数补0),重复以上操作,不超过7个循环,必然得到一个数:6174 这个问题是之前发布的文章, ...

  8. 用C语言验证“6174数学黑洞之谜

    任选4个不完全相同的数字(像1111就不行),让"最大排列"减"最小排列"(例如8753-3578),不断重复这个动作,最后一定会得到相同的结果:6174.神奇 ...

  9. C语言编程练习 6.验证卡布列克运算。即:任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律

    题目描述: *验证卡布列克运算.即:任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律: (1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数: (2)将组成 ...

最新文章

  1. sqap不支持python3吗_Supporting Python 3(支持python3)——欢迎来到Python 3
  2. 奖金16万!首届电子商务AI算法大赛ECAA报名开启
  3. ModBus的小于3.5S间隔的理解
  4. LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
  5. 那些在家啃书自学算法的人,最后都找到工作了吗?
  6. “衰亡”的雅虎:30 亿用户账号全部泄漏还能怎么活?
  7. kali安卓手机木马远控
  8. 如何用AutoRunner录制IE脚本录制
  9. Dell EMC Isilon命令行方式添加一个接口到pool
  10. 用pandas批量分组处理excel数据
  11. NeRF与GAN的交融(一)——NeRF论文阅读
  12. IDEA之翻译器的妙用Translation
  13. 整理文件夹保存同一目录,并统一重命名文件夹名
  14. canvas坐标转换屏幕坐标_Canvas坐标系转换
  15. Scrapy框架爬虫项目:京东商城笔记本电脑信息爬取
  16. 泰拉瑞亚 Terraria Mac版
  17. java-初识大前端Node.js、ES6、Npm、Babel、模块化规范、WebPack、Vue-element-admin本地安装问题及解决、Git安装及配置、uni-app
  18. 高比例风电电力系统储能运行及配置分析(Matlab代码实现)
  19. 谷歌(google)全球网址
  20. JAVA内存管理机制

热门文章

  1. Vue开发中遇到的问题及解决方案
  2. 解决vue项目eslint校验 Do not use ‘new‘ for side effects 的两种方法
  3. 解决 IntelliJ IDEA Tomcat 控制台中文输出乱码问题
  4. 如何在JavaScript中反转字符串?
  5. 什么时候应该将花括号用于ES6导入?
  6. 在JavaScript中使用“原型”还是“ this”?
  7. Python是否具有三元条件运算符?
  8. 阿里云MWC 2019发布7款重磅产品,助力全球企业迈向智能化
  9. spring--源码分析
  10. Weex控制Android返回键解决方案