徐州做网站企业,北京度seo排名,服装商城网站建设,自己做音乐网站有意思的数学问题任意4位不完全一样的数字#xff0c;能组合出的最大数字减去能组合出的最小数字#xff0c;得到一个新的数字(3位数补0#xff09;#xff0c;重复以上操作#xff0c;不超过7个循环#xff0c;必然得到一个数#xff1a;6174这个问题是之前发布的文章能组合出的最大数字减去能组合出的最小数字得到一个新的数字(3位数补0重复以上操作不超过7个循环必然得到一个数6174这个问题是之前发布的文章有读者朋友在文章留言提到这个我觉得比较有意思就拿出来分享最近迷上这类有意思的东西而且是热乎原创的。输入一个数3256将他从小到大输出就是23561、我写的代码刚开始写的第一份代码有个缺陷写完后看到另一个读者提交的答案已经考虑到了这个问题自我感觉大神还是挺多的。我说下我代码里面的几个重点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(i0;ilen;i) arr[i] arr[i] - 0x30;/*字符转成数字*/for(i0;ilen-1;i)for(ji1;jlen;j)if(arr[i] arr[j])return false;return true;
}/*判断是否不足够4位数字*/
int j2(int diff)
{if(diff10){diffdiff*1000;}else if(diff100){diff diff*100;}else if(diff1000){diffdiff*10;}
}/*升序*/
int m(char *arr,int len)
{int i,j;for(i0;ilen-1;i)for(ji1;jlen;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(i0;ilen-1;i)for(ji1;jlen;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(i0;i7;i){/*排序*/m(nums,4);//printf(%d%d%d%d\n,nums[0],nums[1],nums[2],nums[3]);dmax nums[0]*1000 nums[1]*100nums[2]*10nums[3];/*排序*/n(nums,4);//printf(%d%d%d%d\n,nums[0],nums[1],nums[2],nums[3]);dmin nums[0]*1000 nums[1]*100nums[2]*10nums[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(i0;ilen;i) arr[i] arr[i] - 0x30;/*字符转成数字*/for(i0;ilen-1;i)for(ji1;jlen;j)if(arr[i] arr[j])return false;return true;
}/*判断是否不足够4位数字*/
int j2(int diff)
{if(diff10){diffdiff*1000;}else if(diff100){diff diff*100;}else if(diff1000){diffdiff*10;}
}/*升序*/
int m(char *arr,int len)
{int i,j;for(i0;ilen-1;i)for(ji1;jlen;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(i0;ilen-1;i)for(ji1;jlen;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(i0;i7;i){m(nums,4);dmax nums[0]*1000 nums[1]*100nums[2]*10nums[3];n(nums,4);dmin nums[0]*1000 nums[1]*100nums[2]*10nums[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(Cant 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.hint getMax(int byte[]){int max;for(int i0;i3;i){for(int ji1;j4;j){if(byte[i]byte[j]){int tbyte[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]*1000byte[1]*100byte[2]*10byte[3];return max;
}int getMin(int byte[]){int min;for(int i0;i3;i){for(int ji1;j4;j){if(byte[i]byte[j]){int tbyte[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]*1000byte[1]*100byte[2]*10byte[3];return min;
}int main(){int a 0;printf(input the num :\n);int max;int min;scanf(%d,a);for(int i0;i7;i){printf(the num:%d\n,a);if(a10){aa*1000;}else if(a100){a a*100;}else if(a1000){aa*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);amax-min;}return 0;
}
代码运行输出weiqifabsp-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!!!
weiqifabsp-ubuntu1804:~/c$
附图1推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈