15行代码AC——1019 数字黑洞 (20分) 甲级1069. The Black Hole of Numbers (20)(解题报告)
立志用更少的代码做更高效的表达
PAT甲级最优题解——>传送门
Pat乙级最优化代码+题解+分析汇总——>传送门
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …
现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。
输入格式:
输入给出一个 (0,104) 区间内的正整数 N。
输出格式:
如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000;否则将计算的每一步在一行内输出,直到 6174 作为差出现,输出格式见样例。注意每个数字按 4 位数格式输出。
输入样例 1:
6767
输出样例 1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
输入样例 2:
2222
输出样例 2:
2222 - 2222 = 0000
思路分析:
一刷(中规中矩的做法):写了一个排序函数,一个翻转函数, 用while循环遍历, 由于输入如2222或6174这样的数需循环一次再结束, 因此需要做一个特判。 代码量大概是40行左右。
二刷:参考了网上大佬的思路, 借助stoll()、to_string()、sort()等函数完成快速排序及反转, 采用do while循环, 这样就可以在任何情况下都优先输出一次再判断(巧妙!)。 最后只用了15行代码就AC了。
虽然代码二代码量更少,但是效率并不太高, 因为涉及到了整型与字符型的来回切换。 因此将两个代码都放上去, 供大家参考。
关于stoll()函数的用法,见这篇博客——>传送门
思路一
#include<bits/stdc++.h>
using namespace std;int Reserve(int r) { int num = 0;int T= 3;while(r) {num += r%10*pow(10, T--);r /= 10;}return num;
}int Sort(int r) {int T = 0, a[4] = {0};while(r) {a[T++] = r%10;r /= 10;}sort(a, a+4);int num = 0;for(int i = 0; i < 4; i++) num+= a[i]*pow(10,4-i-1);return num;
}int main() {int b1; cin>>b1;b1 = Sort(b1);int b2 = Reserve(b1); if(b1 == b2 || b1 == 6174) {printf("%04d - %04d = %04d\n", b2, b1, b2-b1);return 0; }while(b1!=6174) {b1 = Sort(b1);int b2 = Reserve(b1); printf("%04d - %04d = %04d\n", b2, b1, b2-b1);b1 = b2-b1;}
return 0; }
思路二
#include<bits/stdc++.h>
using namespace std;
int main() {int n; cin>>n;
// cout << setfill('0'); //全篇填充0 do{string s = to_string(n); while(s.size() < 4) s += '0';sort(s.begin(), s.end());int a = stoll(s);sort(s.begin(), s.end(), greater<char>());int b = stoll(s);n = b-a;printf("%04d - %04d = %04d\n", b, a, n);} while(n != 0 && n != 6174);
return 0; }
15行代码AC——1019 数字黑洞 (20分) 甲级1069. The Black Hole of Numbers (20)(解题报告)相关推荐
- 15行代码AC——ZOJ - 4118 Stones in the Bucket(思维题+优化方案)(第十届山东省ACM程序设计竞赛F题)
励志用少的代码做高效表达. 思路分析 题意:给定n个数,问最少操作几次,使数列中的数全部相等. 操作一:将数列中任意数减一. 操作二:将数列中任意数减一.任意数加一(相当于把1挪过去) 涉及到最少的题 ...
- (解题报告)L1-032 Left-pad (20分)——15行代码AC
立志用更少的代码做更高效的表达 根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块 ...
- 15行代码AC——习题3-3 数数字 (UVa1225,Digit Counting)
大意: 把n(n<=10000)个整数顺序写在一起,求0~9分别出现多少次 Sample Input 2 3 13 Sample Output 0 1 1 1 0 0 0 0 0 0 1 6 2 ...
- 1032 挖掘机技术哪家强 (20分)——15行代码AC
立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输 ...
- 测试点3的分析:1022 D进制的A+B (20分)——15行代码AC
立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输 ...
- 15行代码AC——Link/Cut Tree CodeForces - 614A(爆long long处理+快速幂讲解)
励志用少的代码做高效表达 Problem describe Programmer Rostislav got seriously interested in the Link/Cut Tree dat ...
- 15行代码AC——习题3-1 得分 (UVa1585,Score)
题意概述 给出一个由O和X组成的串,统计得分,O得分为目前连续出现的O的个数,X的得分为0. 如:OOXXOXXOOO得分为:1+2+0+0+1+0+0+1+2+3=10 Sample Input 5 ...
- 15行代码AC——习题5-5 复合词(Compound Words, UVa 10391)——解题报告
励志用少的代码做高效的表达 题目(提交)链接→UVA-10391 本题实质是#include<string>头文件的substr()字符串分割函数与#include<algorith ...
- 【PAT甲级 前导0,排序】1069 The Black Hole of Numbers (20 分) C++ 全部AC
题目 一直循环相减即可,直到结果为6174或者四个数字相同就结束循环 题解 C++ #include<iostream> #include<stdio.h> #include& ...
最新文章
- 使用pydub做静音帧去除
- Centos7+Mysql5.7实现主从复制
- vsftp mysql_vsftp mysql安装配置
- 背包问题lingo求解
- python的matplotlib问题
- ArrayList的四种初始化方法
- 高通骁龙855刚捂热 骁龙865就现身:三星代工 7nm EUV制程
- 我的docker随笔24:docker产生coredump文件
- double-talk检测算法分类
- 用cglib生成的代理类取不到注解的问题
- 习惯自律错误让我们真正成长
- Qt —— 海康SDK获取视频并OpenCv处理每帧图像进行显示
- 神州数码无线配置命令
- U3D常用介绍,搭建一个简单的三维效果
- 点云渲染的颗粒感和背景色相关
- 《热尼亚·鲁勉采娃》 作者:尤里·纳吉宾 推荐者:路遥
- oracle begin exception end,Oracle Exception异常处理
- 【历史上的今天】11 月 4 日:“光纤之父”出生;StumbleUpon 诞生;谷歌推出 Google Home
- 象棋笔记 象棋桥 象棋旋风
- python的PDF工具