1019. 数字黑洞 (20)
时间限制
100 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
现给定任意4位正整数,请编写程序演示到达黑洞的过程。
输入格式:
输入给出一个(0, 10000)区间内的正整数N。
输出格式:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。
输入样例1:6767输出样例1:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174输入样例2:
2222输出样例2:
2222 - 2222 = 0000
一定要看清题目,刚开始以为,输入是4位字符串,一直都无法全部通过;后才看清才知道输入是整数
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> char *addDigits=(char*)malloc(5*sizeof(char)); //递增字符串 char * subDigits=(char*)malloc(5*sizeof(char)); //递减字符串 char * resultDigits=(char*)malloc(5*sizeof(char)); int addCmp(const void *a, const void *b) { return *(char*)a>*(char*)b; } int subCmp(const void *a, const void *b) { return *(char*)a<*(char*)b; } char* Kaprekar(char* digits) { if(digits[0]==digits[1] && digits[1]==digits[2] &&digits[2]==digits[3]) { printf("%s - %s = 0000\n",digits,digits); return NULL; } qsort(digits,4,sizeof(char),addCmp); strcpy(addDigits,digits); //qsort(digits,4,sizeof(char),subCmp); //strcpy(subDigits,digits); subDigits[0]=addDigits[3]; //可以减少一次排序调用 subDigits[1]=addDigits[2]; subDigits[2]=addDigits[1]; subDigits[3]=addDigits[0]; subDigits[4]='\0'; printf("%s - %s",subDigits,addDigits); //在这里输出,是因为后面subDigits的内容被修改了 int i; for(i=3;i>=0;i--) //从个位开始 { //printf("%c-%c\n",subDigits[i],addDigits[i]); if(subDigits[i]<addDigits[i]) { subDigits[i]=subDigits[i]+10; subDigits[i-1]=subDigits[i-1]-1; } resultDigits[i]=subDigits[i]-addDigits[i]+'0'; //printf("%c\n",resultDigits[i]); } resultDigits[4]='\0'; //字符数组末尾加上'\0' printf(" = %s\n",resultDigits); return resultDigits; } int main() { int n; char digits[5]={'0','0','0','0','\0'}; //数组包括最后的'\0',所以大小是5,而不是4 scanf("%d",&n); digits[0]=n%10+'0'; digits[1]=(n/10)%10+'0'; digits[2]=(n/100)%10+'0'; digits[3]=(n/1000)+'0'; char *temp=Kaprekar(digits); while(temp!=NULL) { if(strcmp(temp,"6174")==0) break; temp=Kaprekar(temp); } }