1069. The Black Hole of Numbers (20)

http://www.patest.cn/contests/pat-a-practise/1069


For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in non-increasing order first, and then in non-decreasing order, a new number can be obtained by taking the second number from the first one. Repeat in this manner we will soon end up at the number 6174 -- the "black hole" of 4-digit numbers. This number is named Kaprekar Constant.

For example, start from 6767, we'll get:

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...

Given any 4-digit number, you are supposed to illustrate the way it gets into the black hole.

Input Specification:

Each input file contains one test case which gives a positive integer N in the range (0, 10000).

Output Specification:

If all the 4 digits of N are the same, print in one line the equation "N - N = 0000". Else print each step of calculation in a line until 6174 comes out as the difference. All the numbers must be printed as 4-digit numbers.

Sample Input 1:
6767
Sample Output 1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
Sample Input 2:
2222
Sample Output 2:
2222 - 2222 = 0000
//17:35 -18:04

#include <stdio.h>
#include <math.h>
int same[10] = {0000,1111,2222,3333,4444,5555,6666,7777,8888,9999};
int isSame(int n){
	return n == same[n%10];
}
void f(int n,int* n1,int* n2){
	int t[4],i,j,tmp;
	for(i = 0;i < 4;i++){
		t[i] = n % 10;
		n = n / 10;
	}
	for(i = 0;i < 4;i++){
		for(j = 0;j < 3 - i;j++){
			if(t[j] > t[j+1]){
				tmp = t[j];
				t[j] = t[j+1];
				t[j+1] = tmp;
			}
		}
	}
	(*n1) = (*n2) = 0;
	for(i = 0;i < 4;i++){
		(*n2) += t[i] * (int)pow(10,3-i);
		(*n1) += t[i] * (int)pow(10,i);
	}
}
int t(){
	int n,n1,n2,diff;
	scanf("%d",&n);
	if(isSame(n)){
		printf("%04d - %04d = 0000\n",n,n);
	}
	else{
		f(n,&n1,&n2);
		diff = n1 - n2;
		while(diff != 6174){
			printf("%04d - %04d = %04d\n",n1,n2,diff);
			f(diff,&n1,&n2);
			diff = n1 - n2;
		}
		printf("%04d - %04d = %04d\n",n1,n2,diff);
	}
	return 0;
}

int main(){
	while(1)
		t();
	return 0;
}


你可能感兴趣的:(算法,解题报告,浙大机试)