题目描述
给定任一个各位数字不完全相同的 4 位正整数, 如果我们先把 4 个数字按非递增排序, 再按非递减排序, 然后用第 1 个数字减第 2 个数字, 将得到
一个新的数字. 一直重复这样做, 我们很快会停在有 "数字黑洞" 之称的 6174, 这个神奇的数字也叫 Kaprekar 常数.
例如, 我们从 6767 开始, 将得到
- 7766 - 6677 = 1089
- 9810 - 0189 = 9621
- 9621 - 1269 = 8352
- 8532 - 2358 = 6174
- 7641 - 1467 = 6174
- ... ...
现给定任意 4 位正整数, 请编写程序演示到达黑洞的过程.
输入描述:
- 7766 - 6677 = 1089
- 9810 - 0189 = 9621
- 9621 - 1269 = 8352
- 8532 - 2358 = 6174
- #include<stdio.h>
- #include<stdlib.h>
- int str_to_int(const void *str)
- {
- char *s=(char *)str;
- int i;
- for(i=0;i<4;i++){
- if(s[i]=='\0')
- s[i]='0';
- }
- return (s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+(s[3]-'0');
- }
- void int_to_str(const int num,char *str)
- {
- str[0]=num/1000+'0';
- str[1]=num/100%10+'0';
- str[2]=num/10%10+'0';
- str[3]=num%10+'0';
- }
- int comp_min(const void *a,const void *b)
- {
- return *(char*)a-*(char*)b;
- }
- int comp_max(const void *a,const void *b)
- {
- return -(*(char*)a-*(char*)b);
- }
- int main()
- {
- char str[4]={'0','0','0','0'};
- int max=0,min=0,res_num=0;
- scanf("%s",str);
- res_num=str_to_int(str);
- qsort(str,4,sizeof(char),comp_min);
- min=str_to_int(str);
- qsort(str,4,sizeof(char),comp_max);
- max=str_to_int(str);
- do{
- if(max-min==0){
- printf("%04d - %04d = 0000\n",max,min);
- break;
- }else if(max<=0||max>=10000||min<=0||min>=10000)
- break;
- printf("%d - %04d = %d\n",max,min,max-min);
- res_num=max-min;
- int_to_str(max-min,str);
- qsort(str,4,sizeof(char),comp_min);
- min=str_to_int(str);
- qsort(str,4,sizeof(char),comp_max);
- max=str_to_int(str);
- }while(res_num!=max-min);
- return 0;
- }
来源: http://www.bubuko.com/infodetail-2559986.html