您的位置:首页 > 其它

PAT 1019. 数字黑洞 4000

2017-12-17 11:18 134 查看


1019. 数字黑洞 (20)

时间限制

100 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

CHEN, Yue

给定任一个各位数字不完全相同的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位数格式输出。
输入样例1:
6767

输出样例1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

输入样例2:
2222

输出样例2:
2222 - 2222 = 0000

自己编写的代码:
感觉比较臃肿,但运行速度还是可以的


#include<iostream>

#include<sstream>

#include<math.h>

#include<iomanip>

using namespace std;

void Insertion_sort(int a[],int N){
int i,j; 
for(i=1;i<N;i++){
int temp=a[i];
for(j=i;j>0;j--)
if(a[j-1]>temp) swap(a[j-1],a[j]);
else break;
a[j]=temp;
}



int main(){
string s;
cin>>s;
s.insert(0,4-s.length(),'0');
int a[4];
int r=0;
while(r!=6174){
int m=0,n=0;
for(int i=0;i<4;i++)
a[i]=s[i]-'0';
Insertion_sort(a,4);

    for(int i=0;i<4;i++){

    m+=a[i]*pow(10,i);

    n+=a[i]*pow(10,3-i);
}
r=m-n;
cout<<setw(4)<<setfill('0')<<m;
cout<<" - "; cout<<setw(4)<<setfill('0')<<n;
cout<<" = "; cout<<setw(4)<<setfill('0')<<r<<endl;
if(r==0) break;
ostringstream os;
os<<setw(4)<<setfill('0')<<r;
s=os.str();
}
return 0; 



一个我十分佩服的大神写的,十分简洁;

#include <iostream>

#include <algorithm>

using
namespace
std;

bool
cmp(char
a,
char
b)
{return
a
>
b;}

int
main()
{

    string
s;

    cin
>>
s;

    s.insert(0,
4
-
s.length(),
'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;

}
从中学到了许多东西,关于string的一些操作,在看完c++primer后忘光了。
在此立下金光闪闪的flag,一定会在刷PAT过程中再读一遍。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: