C语言验证6174数学问题

有意思的数学问题

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

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

输入一个数3256,将他从小到大输出,就是2356

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<len;i++) arr[i] = arr[i] - 0x30;/*字符转成数字*/for(i=0;i<len-1;i++)for(j=i+1;j<len;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<len-1;i++)for(j=i+1;j<len;j++)/*和之后的位置比较*/if( arr[i] < arr[j]){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<len-1;i++)for(j=i+1;j<len;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<len;i++) arr[i] = arr[i] - 0x30;/*字符转成数字*/for(i=0;i<len-1;i++)for(j=i+1;j<len;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<len-1;i++)for(j=i+1;j<len;j++)/*和之后的位置比较*/if( arr[i] < arr[j]){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<len-1;i++)for(j=i+1;j<len;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 < 10; i++){j[i] = i;}for(i = 0; i < 4; 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 <stdio.h>int getMax(int byte[]){int max;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"); 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

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cortex-M3工作模式与异常

Cortex-M3工作模式与异常 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、工作模式 线程模式和手柄模式。 当处理器处在线程状态下时&#xff0c;既可以使用特权级&#xff0c;也可以使用用户级&#xff1b;另一方面&#xff0c; handler模式总是特…

自己动手实现一个malloc内存分配器 | 30图

对内存分配器透彻理解是编程高手的标志之一。如果你不能理解malloc之类内存分配器实现原理的话&#xff0c;那你可能写不出高性能程序&#xff0c;写不出高性能程序就很难参与核心项目&#xff0c;参与不了核心项目那么很难升职加薪&#xff0c;很难升级加薪就无法走向人生巅峰…

机器学习面试——分类算法SVM

1、什么是硬间隔和软间隔&#xff1f; 当训练数据线性可分时&#xff0c;通过硬间隔最大化&#xff0c;学习一个线性分类器&#xff0c;即线性可分支持向量机。 当训练数据近似线性可分时&#xff0c;引入松弛变量&#xff0c;通过软间隔最大化&#xff0c;学习一个线性分类器…

Cortex M3 NVIC与中断控制

Cortex M3 NVIC与中断控制 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、NVIC概览 ——嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问&#xff0c;除了包含控制寄存器和中断处理的控制逻辑之外&#xff0c; NVIC 还包含了 MPU、 S…

VS 2005 或 VS 2008 在安装VSS 2005后,看不到源代码管理的解决办法

昨天有朋友在重新安装VS 2008后&#xff0c;再安装VSS 2005&#xff0c;安装好后在文件菜单中找不到“源代码管理”的菜单项&#xff0c;后来经朋友告知&#xff0c;是开发工具的默认选项设置问题。打开开发工具&#xff0c;“工具”--“选项”&#xff1a;&#xff08;如图&am…

代码里-3gt;gt;1是-2但3gt;gt;1是1,-3/2却又是-1,为什么?

之前群里有个同学向大家提出了类似这样的问题。随后这位同学公布了答案&#xff1a;右移运算是向下取整&#xff0c;除法是向零取整。这句话对以上现象做了很好的总结&#xff0c;可是本质原因是什么呢&#xff1f;我一直以为-3>>1的结果是-1。所以打算思考一下这个问题。…

机器学习面试——逻辑回归和线性回归

1、什么是广义线性模型&#xff08;generalize linear model&#xff09;&#xff1f; 普通线性回归模型是假设X为自变量&#xff0c;Y为因变量&#xff0c;当X是一维的&#xff0c;y是一维的&#xff0c;共进行n次观测&#xff0c;则 其中&#xff0c;w是待估计的参数&#x…

STM32开发环境

STM32开发环境 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、MDK安装 MDK 是一个集代码编辑&#xff0c;编译&#xff0c;链接和下载于一体的集成开发环境&#xff08; KDE &#xff09;。MDK 这个名字我们可能不熟悉&#xff0c;但说到 KEIL …

机器学习面试——XGBoost,GBDT,RF(上)

1、常见的集成思想 bagging&#xff1a;基学习器之间并行训练&#xff0c;且学习器之间没有依赖&#xff0c;像是集体决策的过程&#xff0c;每个个体都进行单独学习&#xff0c;再通过投票的方式做最后的集体决策。常见的算法有随机森林 boosting&#xff1a;基学习器之间串…

听说有人不了解柔性数组

1 引言 定长数组包在平时的开发中&#xff0c;缓冲区数据收发时&#xff0c;如果采用缓冲区定长包&#xff0c;假定大小是 1k&#xff0c;MAX_LENGTH 为 1024。结构体如下&#xff1a;// 定长缓冲区 struct max_buffer {int len;char data[MAX_LENGTH]; };数据结构的大小 &…

Transformer模型拆解分析

资源来自&#xff1a;DataWhale 学习资料 最近看了DataWhale 的Transformer图解&#xff0c;突然对Transformer的结构图有了更加清晰的理解&#xff0c;特此记录。 1、大框架 Transformer是由6个encoder和6个decoder组成&#xff0c;模型的具体实现是model变量里边&#xff0…

设计模式学习笔记六:.NET反射工厂

1&#xff0e; 简述 通过前面的学习&#xff0c;我们以传统的方式实现了简单工厂&#xff0c;工厂方法和抽象工厂&#xff0c;但是有些场合下如此处理&#xff0c;代码会变得冗余并且难以维护。假设我们要创建交通工具。可以是汽车&#xff0c;火车&#xff0c;轮船等&#xff…

在unity 中,使用http请求,下载文件到可读可写路径

在这里我用了一个线程池&#xff0c;线程池参数接收一个带有object参数的&#xff0c;无返回值的委托 &#xff0c;下载用到的核心代码&#xff0c;网上拷贝的&#xff0c;他的核心就是发起一个web请求&#xff0c;然后得到请求的响应&#xff0c;读取响应的流 剩下的都是常见的…

在tinyalsa上抓取音频

我们经常会遇到这样的问题&#xff0c;应用读取到的音频有问题&#xff0c;需要在tinyalsa里面读取音频来确认是底层音频有问题&#xff0c;还是应用处理之后存在的问题。所以&#xff0c;这个patch就出现了代码的逻辑很简单&#xff0c;主要是在pcm_read的时候&#xff0c;同时…

STM32——GPIO(1)

STM32——GPIO 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 【对单片机的操作就是控制IO口】 一、GPIO&#xff08;通用输入输出口&#xff09; 1、选定需要的引脚&#xff08;对应哪一个IO口&#xff09;&#xff1b; 2、配置需要的功能&#xf…

【opencv学习笔记八】创建TrackBar轨迹条

createTrackbar这个函数我们以后会经常用到&#xff0c;它创建一个可以调整数值的轨迹条&#xff0c;并将轨迹条附加到指定的窗口上&#xff0c;使用起来很方便。首先大家要记住&#xff0c;它往往会和一个回调函数配合起来使用。先看下他的函数原型&#xff1a; int createTra…

父母悄悄给自己买房,我很生气,要怎么调整心态?

——问题我是独生子&#xff0c;今年满24岁刚上研一&#xff08;普通211&#xff09;。家庭四川小城市&#xff0c;情况一般&#xff0c;父母二人体制内月薪总计一万元以内&#xff0c;家里积蓄20W-30W&#xff0c;公积金情况不清楚。从小母子关系比较僵硬&#xff0c;母亲小学…

语音处理入门——语音的声学处理

语音的声学处理通常称为特征提取或者信号分析&#xff0c;特征是表示语音信号的一个时间片的矢量。常见的特征类型有LPC&#xff08;线性预测编码&#xff09;特征和PLP&#xff08;感知线性预测编码&#xff09;&#xff0c;该特征称为声谱特征&#xff0c;使用形成波形的不同…

基础呀基础,用二极管防止反接,你学会了吗?

使用新的电源&#xff0c;第一次给设备供电时&#xff0c;要特别注意电源的正负极性标注。比如电源适配器&#xff0c;铭牌上面有标注插头的极性。这个符号说明插头的里面是正极&#xff0c;外面是负极&#xff0c;即“内正外负”。但是也有反过来的&#xff0c;下面这款是“内…

李宏毅的可解释模型——三个任务

1、问题 观看了李宏毅老师的机器学习进化课程之可解释的机器学习&#xff0c;课程中对主要是针对黑盒模型进行白盒模型转化的技巧和方法进行了简单介绍&#xff0c;详细细节可以参考《Interpretable Machine Learning》。像一些线性模型、树形模型是可解释的ML model&#xff…