PAT乙级真题:C++:数字黑洞
题目描述
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …
现给定任意4位正整数,请编写程序演示到达黑洞的过程。
输入描述
输入给出一个(0, 10000)区间内的正整数N。
输出描述
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格式输出。
输入例子
6767
输出例子
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
题解
需要注意几个地方:
- 不足四位数,在输出时要补齐四位。
- 当6174作为差出现时,才停止循环。
代码
C++版本:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
//数字降序排序
int getMax(int num) {
vector<int> v;
while(num>0) {
v.push_back(num%10);
num/=10;
}
sort(v.begin(),v.end());
while(v.size()<4) {
v.insert(v.begin(),0);
}
return v[0]+10*v[1]+100*v[2]+1000*v[3];
}
//数字升序排序
int getMin(int num) {
vector<int> v;
while(num>0) {
v.push_back(num%10);
num/=10;
}
sort(v.begin(),v.end());
while(v.size()<4) {
v.insert(v.begin(),0);
}
return v[3]+10*v[2]+100*v[1]+1000*v[0];
}
//打印输出数字,不足四位数则补齐
void print(int num) {
if(num<10) {
cout<<"000";
} else if(num<100) {
cout<<"00";
} else if(num<1000) {
cout<<"0";
}
cout<<num;
}
int main() {
int num;
cin>>num;
while(true) {
int max=getMax(num);
int min=getMin(num);
if(max==min) {
cout<<"N - N = 0000";
return 0;
}
print(max);
cout<<" - ";
print(min);
cout<<" = ";
print(max-min);
cout<<endl;
num=max-min;
if(num==6174) break;
}
}
在讨论区看到一个python版本代码,深感简洁度上的差距。一并贴在这里,作为启发。
num = input()
def calc(num):
if len(set(num)) == 1:
print(num + " - " + num + " = 0000")
return "6174"
else:
num1 = "".join(sorted(num, reverse=True))
num2 = "".join(sorted(num))
result = str(int(num1) - int(num2))
print(num1 + " - " + num2 + " = " + result)
return result
num=calc(num.ljust(4,"0"))
while num != "6174":
num = calc(num.ljust(4,"0"))
还没有评论,来说两句吧...