1019.数字黑洞 (20)
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
输入样例1:
6767
输出样例1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
输入样例2:
2222
输出样例2:
2222 - 2222 = 0000
现给定任意4位正整数,请编写程序演示到达黑洞的过程。
输入格式:
输入给出一个(0, 10000)区间内的正整数N。
输出格式:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。
分析:
这道题目看似简单,其实很容易犯错,主要是如果计算的时候使用数字的话,前面的0是不会保留的,这样就会出错。所以单独有一个方法,是将数字转换成字符数组,这样就不容易出现问题了。
using System;
namespace PAT
{
class Program
{
static void Main(string[] args)
{
int number = int.Parse(Console.ReadLine());
char[] sortedDigits = SortNumber(ConvertNumToCharArray(number));
int large, small;
int result = -1;
while(result != 6174 && result != 0)
{
large = small = 0;
for (int i = 0; i < 4; i++)
{
large += (int)Math.Pow(10, 3 - i) * (sortedDigits[i] - '0');
small += (int)Math.Pow(10, 3 - i) * (sortedDigits[3-i] - '0');
}
result = large - small;
Console.WriteLine("{0:0000} - {1:0000} = {2:0000}", large, small, result);
sortedDigits = SortNumber(ConvertNumToCharArray(result));
}
}
static char[] ConvertNumToCharArray(int number)
{
char[] digitArray = { '0', '0', '0', '0' };
int flag = 3;
while (number != 0)
{
digitArray[flag] = (char)(number % 10 + '0');
number /= 10;
flag--;
}
return digitArray;
}
static char[] SortNumber(char[] numberChar)
{
int j;
for(int i = 1; i < numberChar.Length; i++)
{
int temp = numberChar[i];
for (j = i; j > 0 && numberChar[j - 1] < temp; j--)
numberChar[j] = numberChar[j - 1];
numberChar[j] = (char)temp;
}
return numberChar;
}
}
}