PAT 乙级 1019 数字黑洞 v1.0
1. 题目描述及在线测试位置
1.1 编写程序演示到达数字黑洞的过程。注意,输入数字的范围是(0,10000),因此存在非四位数的情况(这一点比较坑)
1.2 在线测试位置:PAT 1019 数字黑洞
2. 具体实现
2.1 基本思路
将输入数字的 各个位数 存储到数组中,先后对数组进行非递增排序 和 非递减排序,分别得到 被减数 和 减数,做减法运算,若运算结果为0 或 数字黑洞 6174 则程序结束,否则继续循环
2.2 AC代码
#include <algorithm>
#include <iostream>
using namespace std;
#define N 4
#define DigitalBlackHole 6174
bool Compare(char A, char B)
{
return A > B;
}
int GetNumber(int a[]);
void Print(int Number);
void Store(int a[], int Number);
int main()
{
int Number;
int a[N];
int High = 0, Low = 0;
cin >> Number;
while (true)
{
Store(a, Number); //将输入数字Number的各个位数存储到数组a中
sort(a, a + N, Compare); //非递增排序得到被减数
High = GetNumber(a);
sort(a, a + N); //非递减排序得到减数
Low = GetNumber(a);
Number = High - Low;
Print(High); cout << " - "; Print(Low); cout << " = ";
Print(Number); cout << endl;
//若运算结果为0 或 数字黑洞 6174 则程序结束,否则继续循环
if (Number == DigitalBlackHole || !Number)
break;
}
return 0;
}
void Store(int a[], int Number)
{
for (int i = 0; i < N; i++)
{
a[i] = Number % 10;
Number = Number / 10;
}
}
void Print(int Number)
{
if (Number)
{
int Scale = 1000;
while (Number < Scale)
{
cout << "0";
Scale /= 10;
}
cout << Number;
}
else
cout << "0000";
}
int GetNumber(int a[])
{
int Scale = 1, Result = 0;
for (int i = N-1; i >= 0; i--)
{
Result += a[i] * Scale;
Scale *= 10;
}
return Result;
}