题目
数字黑洞,给定一个四位数,然后按照数字大小从大到小排序和从小到大排序,然后相减,得到一个新的四位数,重复上述过程,最后的结果一定是6174,要求打印整个过程
代码和思路
- 一开始的时候想用字符串处理做加减,但是用字符串加减的速度比直接整型数加减慢太多了一定会超时,而且会有两个答案错误,仔细思考代码逻辑后并未发现有什么问题
- 但为了AC,查到了一种思路,就是使用sscanf和sprintf,这两个函数位于 #include<stdio.h> 头文件中
- 假设定义了一个char数组str
sscanf(str, “%d”, &n) 的作用是吧字符数组 str 中的内容以 “%d” 的格式写进 n 中sscanf(str, "%d", &n); sprintf(str, "%d", n);
sprintf(str, “%d”, n); 的作用是把 n 以 “%d” 的格式写进 str 数组中 - 有了这两个函数,相当于有了可以在字符串数组和数字之间一步转换的工具,这样的话就可以很好的进行排序和加减了(这个题目矛盾点就在用用字符串处理加减会超时错,用数字处理不方便排序,而这两个函数很好地解决了这个问题)
//代码来自于大佬。。不是我自己写的
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
char s[6];
int main() {
int n;
for (scanf("%d",&n);;) {
int x,y;
sprintf(s, "%04d", n);
sort(s, s + 4);
reverse(s, s + 4);
printf("%s - ",s);
sscanf(s, "%d", &x);
reverse(s, s + 4);
printf("%s",s);
sscanf(s, "%d", &y);
printf(" = %04d\n",n = x - y);
if ((n == 0) || (n == 6174)) {
break;
}
}
return 0;
}