PAT 1069

题目

数字黑洞,给定一个四位数,然后按照数字大小从大到小排序和从小到大排序,然后相减,得到一个新的四位数,重复上述过程,最后的结果一定是6174,要求打印整个过程

代码和思路

  1. 一开始的时候想用字符串处理做加减,但是用字符串加减的速度比直接整型数加减慢太多了一定会超时,而且会有两个答案错误,仔细思考代码逻辑后并未发现有什么问题
  2. 但为了AC,查到了一种思路,就是使用sscanf和sprintf,这两个函数位于 #include<stdio.h> 头文件中
  3. 假设定义了一个char数组str
    sscanf(str, "%d", &n);
    sprintf(str, "%d", n);
    
    sscanf(str, “%d”, &n) 的作用是吧字符数组 str 中的内容以 “%d” 的格式写进 n 中
    sprintf(str, “%d”, n); 的作用是把 n 以 “%d” 的格式写进 str 数组中
  4. 有了这两个函数,相当于有了可以在字符串数组和数字之间一步转换的工具,这样的话就可以很好的进行排序和加减了(这个题目矛盾点就在用用字符串处理加减会超时错,用数字处理不方便排序,而这两个函数很好地解决了这个问题)
//代码来自于大佬。。不是我自己写的
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值