【PAT甲级】1069 The Black Hole of Numbers (20分)

解题过程的小记录,如有错误欢迎指出。

难度:二星(要考虑一下几个特殊点的输出)

题目分析

给出一个四位数,让其各位上的数排列组合的最大数减去最小数,若四位数各位上的数不相同则经过有限次的减法后会被吸入6174的黑洞

注意点

  1. 直接输入6174也要输出一次减法过程
  2. 数字要补全四位,不足四位的前面补零

我的解题过程

思路

  1. 将四位数拆分成四个单独的个位数,拆分的时候,数组的初始化值都为0,起到了自动补全0的效果
  2. 判断四位数各位上的数字是否相等,相等的话输出结果为0的等式结束程序
  3. 若不相等则拆分后组成最大数和最小数进行相减,输出相减等式,直到被吸入黑洞

bug

没有考虑输入为6174的情况,因为原先的代码逻辑在试直接判断num是否为6174,如果是的话直接就不跳入循环结束程序,只要在循环开始前判断一下即可

代码

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

vector<int> tearApart(int num) {
	vector<int> ans(4, 0);
	int i = 0;
	while (num != 0) {
		ans[i++] = num % 10;
		num = num / 10;
	}
	return ans;
}

int FindBlackHole(int num) {
	vector<int> n = tearApart(num);
	sort(n.begin(), n.end());
	int minNUM = n[0] * 1000 + n[1] * 100 + n[2] * 10 + n[3];
	int maxNUM = n[3] * 1000 + n[2] * 100 + n[1] * 10 + n[0];
	printf("%04d - %04d = %04d\n", maxNUM, minNUM, maxNUM - minNUM);
	return maxNUM - minNUM;
}

int main()
{
	//输入
	int num;
	cin >> num;
	//拆分
	vector<int> n = tearApart(num);
	if (n[0] == n[1] && n[1] == n[2] && n[2] == n[3]) {
		printf("%04d - %04d = 0000", num, num);
		return 0;
	}
	//找黑洞
	num = FindBlackHole(num);
	while (num != 6174) {
		num = FindBlackHole(num);
	}
    return 0;
}

dalao的代码

全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~

借鉴点

  1. 如果在while循环之前先要判断一次的话,如本题的6174情况,可以采用do{}while();结构,如下
do {
	num = FindBlackHole(num);
} while (num != 6174);
  1. 采用字符串的方法,就可以不用拆分了
bool cmp(char a, char b) {return a > b;}
int main() {
 	string s;
	 cin >> s;
	 s.insert(0, 4 - s.length(), '0');//用于在不足四位的时候插入0
 	do {
		 string a = s, b = s;
 		sort(a.begin(), a.end(), cmp);//从大到小排序,用于产生最大值
 		sort(b.begin(), b.end());//从小到大排序,用于产生最小值
		int result = stoi(a) - stoi(b);
 		s = to_string(result);
 		s.insert(0, 4 - s.length(), '0');
 		cout << a << " - " << b << " = " << s << endl;
 	} while (s != "6174" && s != "0000");
 	return 0; 
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值