PAT 1019数字黑洞

来源:互联网 发布:西斯托 fm数据 编辑:程序博客网 时间:2024/05/17 23:51

给定任一个各位数字不完全相同的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 = 10899810 - 0189 = 96219621 - 1269 = 83528532 - 2358 = 6174
输入样例2:
2222
输出样例2:

2222 - 2222 = 0000

分析:

注意几点:1.当数字位数低于4位时(输入的数也可能低于4位),应该补充前面的‘0’.

2.测试样例中有6174,所以用do-while语句.

3.在数字和string型数据之间转换,以满足排序和减法.

源代码:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string dijian(string s1)//输出一个字符串的递减序列
{   char temp;
for(int i=0;i<4;i++)
for(int j=0;j<3;j++)
if(s1[j]<s1[j+1])
{
temp=s1[j];
s1[j]=s1[j+1];
s1[j+1]=temp;
}
return s1;
}
string dizeng(string s1)//输出一个字符串的递增序列
{
char temp;
for(int i=0;i<4;i++)
for(int j=0;j<3;j++)
if(s1[j]>s1[j+1])
{
temp=s1[j];
s1[j]=s1[j+1];
s1[j+1]=temp;
}
return s1;
}
int tonum(string s)//将字符串转为int型
{
int num=0;
for(int i=0;i<4;i++)
num=num*10+s[i]-'0';
return num;
 } 
string tostr(int n)//将int型转为字符串
{   int temp;int sum=0;string s;
while(n!=0)
{
temp=n%10;
n=n/10;
sum++;
s=(char)(temp+'0')+s;
}
for(int i=0;i<4-sum;i++)
s="0"+s;
return s;
}
int main()
{
int n;cin>>n;string s1,s2,s;int temp;
s=tostr(n);
if(s[0]==s[1]&&s[1]==s[2]&&s[2]==s[3])
{
cout<<s<<" - "<<s<<" = 0000"<<endl;
return 0;
}
do{

s1=dijian(s);
s2=dizeng(s);
temp=tonum(s1)-tonum(s2);
s=tostr(temp);
cout<<s1<<" - "<<s2<<" = "<<s<<endl;
}while(s!="6174");
return 0;
}

原创粉丝点击