算法笔记 简单数学

只需要掌握简单的数理逻辑即可解决的简单数学问题。

【PAT B1019】数字黑洞

解题思路:

  • 因为需要频繁地将数组和数字进行转换,因此编写两个函数 to_array 和 to_num
  • 进行循环,每轮循环中,首先将数组递增排序,转化为数字,存储至 min 中;再将数组递减排序,转化为数组,存到 max 中。输出此轮结果,并判断是否继续循环。
  • 当差值为 0 或 6174 时,停止循环。

解题代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <cstdio>
#include <algorithm>
using namespace std;

bool cmp(int a, int b){
return a > b;
}
void to_array(int n, int num[]){
for (int i = 0; i < 4; i++){
num[i] = n % 10;
n /= 10;
}
}
int to_num(int num[]){
int sum = 0;
for (int i = 0; i < 4; i++)
sum = sum * 10 + num[i];
return sum;
}

int main(){
int n, max, min, difference = 1;
int num[5];
scanf("%d", &n);
while (difference != 0 && difference != 6174){
to_array(n, num); //将数字转化为数组
sort(num, num + 4); //递增排序
min = to_num(num);
sort(num, num + 4,cmp);
max = to_num(num);
n = difference = max - min;
printf("%04d - %04d = %04d\n", max, min, difference);
}

}

参考

  • 算法笔记