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模式总是特…

Python学习——模块的基本知识

http://www.cnblogs.com/alex3714/articles/5161349.html# 定义# 模块&#xff1a;用来从逻辑上组织python代码&#xff08;变量&#xff0c;函数&#xff0c;类&#xff0c;逻辑&#xff1a;实现一个功能&#xff09;&#xff0c;本质就# 是.py结尾的python文件&#xff08;文…

Windows XP系统的“恢复”办法

Windows XP系统的“恢复”办法 1&#xff0e;让SFC命令全面修复受损文件 如果系统因丢失了太多的系统重要文件而变得非常不稳定&#xff0c;那么按照前面介绍的方法一一修复&#xff0c;相必会让人发疯的。这时就需要使用SFC文件检测器命令&#xff0c;来全面的检测并修复受损的…

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

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

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

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

计算机的发展史及多道技术

首先先补充一下上一篇的一个小问题。 应用程序的启动流程&#xff1a;   前提&#xff1a;应用程序是运行于操作系统之上的   举例&#xff1a;启动暴风音影     1.双击快捷方式     2.告诉操作系统一个文件路径     3.操作系统从硬盘读取文件内容到内存中   …

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…

洛谷P3205合唱队——区间DP

题目&#xff1a;https://www.luogu.org/problemnew/show/P3205 枚举点&#xff0c;分类为上一个区间的左端点或右端点&#xff0c;满足条件便即可&#xff1b; 注意不要重复(当l2时)。 代码如下&#xff1a; #include<iostream> #include<cstdio> using namespace…

远程连接server问题

开启Windows防火墙后&#xff0c;当远程连接Server服务器时被拒绝&#xff0c;其解决方法如下&#xff1a;1、启动Windows防火墙。开始 > 设置 > 控制面板 > Windows防火墙。缺省情况下&#xff0c;防火墙是启用的&#xff0c;这是推荐的设置。2、点击“例外”选项卡。…

STM32开发环境

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

看完「大江大河2」

昨晚熬夜看完&#xff0c;说下自己的想法虽然不能做到百分之百的感同身受&#xff0c;但是确实被剧中的情景所感染&#xff0c;想做成大事情&#xff0c;需要经历的磨难一定也会很大&#xff0c;正如很多年前老水打篮球说的那句「管理人&#xff0c;远远比技术更难」。相比于老…

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

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

一个女程序员的创业人生:胆识也是一种能力 作者:秋镇菜

我在28岁生日那天电信一个副总劝我出来开公司算了&#xff0c;然后想了一天第二天就去工商局注册了&#xff0c;从有开公司的想法到工商局注册仅仅一天时间&#xff01;然后2003年8 月份拿到营业执照&#xff0c;根本不知道安全是怎么一回事情&#xff0c;找北大方正一个技术副…

[SDOI2016]排列计数

Description 求有多少种长度为 n 的序列 A&#xff0c;满足以下条件&#xff1a;1 ~ n 这 n 个数在序列中各出现了一次若第 i 个数 A[i] 的值为 i&#xff0c;则称 i 是稳定的。序列恰好有 m 个数是稳定的满足条件的序列可能很多&#xff0c;序列数对 10^97 取模。Input 第一行…

听说有人不了解柔性数组

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

STM32启动文件——startup_stm32f10x_hd.s

STM32启动文件——startup_stm32f10x_hd.s 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、启动文件的作用 &#xff08;关于启动代码的作用&#xff0c;前面已经提到过了&#xff0c;这里再啰嗦一下&#xff09; &#xff08;1&#xff09;初始化…

Transformer模型拆解分析

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