问题G:卡布列克常数
时间限制:1秒内存限制:128 MB
提交:489解决:288
[ 提交 ] [ 状态 ] [ 讨论版 ] [命题人:admin ]
题目描述
最近,小Q在数学兴趣课中了解了“卡布列克常数”卡布列克是一位数学家,他在研究数字时发现:任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个最大的数和一个最小的数,然后用最大数减去最小数,差不够四位数时补零,类推下去,最后将变成一个固定的数: 6174,这就是卡布列克常数。
例如:4321-1234 = 3087
8730-378 = 8352
8532-2358 = 6174
7641-1467 = 6174
......
小Q想,我能不能编程来验证呢?输入一个符合条件的四位数,然后验证运算过程。
输入
共1行,为任意一个不是用完全相同数字组成的四位数。
输出
变为卡布列克常数的运算过程,由若干行组成,每行是一个算式,不含空格。
样例输入
复制样例数据
样例输出
#include<stdio.h>
int lol(int n);
int node1(int p);//最大数
int node2(int op);//最小数
int main()
{
int j,k,i,n;
scanf("%d",&n);
do
{
if(lol(n)==1)
{
n=n*1000;
}
else if(lol(n)==2)
{
n=n*10;
}
else if(lol(n)==3)
{
n=n*10;
}
j=node1(n);
k=node2(n);
n=j-k;
printf("%d-%d=%d\n",j,k,n);
}while(n!=6174);
return 0;
}
int node1(int p)
{
int i,s[4],j,lp=0;
for(i=0;i<4;i++)
{
s[i]=p%10;
p=p/10;
}
for(i=3;i>=0;i--)
{
for(j=0;j<i;j++)
{
if(s[j]>s[j+1])
{
int temp;
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
for(i=3;i>=0;i--)
{
if(i==3)
{
lp=s[i];
}
else
{
lp=(lp*10)+s[i];
}
}
return lp;
}
int node2(int op)
{
int i,j,s[4],kp=0;
for(i=0;i<4;i++)
{
s[i]=op%10;
op=op/10;
}
for(i=3;i>=0;i--)
{
for(j=0;j<i;j++)
{
if(s[j]<s[j+1])
{
int temp;
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
for(i=3;i>=0;i--)
{
if(i==3)
{
kp=s[i];
}
else
{
kp=(kp*10)+s[i];
}
}
return kp;
}
int lol(int n)
{
int count=1;
while(n>=10)
{
count++;
n=n/10;
}
return count;
}