#include<string.h>
int a, b, n;
char s[10];
sprintf(s, "%d", x);//输出输入进来的数字
n = strlen(s);
for(int i = 0; i < n; i++)
for(int j = i+1; j < n; j++)
if(s[i] > s[j]) {
char t = s[i]; s[i] = s[j]; s[j] = t;
}
sscanf(s, "%d", &b);//输出冒泡排序拍好的由小到大的数
for(int i = 0; i < n/2; i++) {
char t = s[i]; s[i] = s[n-1-i]; s[n-1-i] = t;
}//输出由大到小的数
sscanf(s, "%d", &a);//sscanf在这里承担格式转换功能
return a - b;
}
int num[2000], count;//num[2000]用来存储路径上的每一个数字
int main() {
scanf("%d", &num[0]);
printf("%d", num[0]);
count = 1;
for(;;) {
num[count] = get_next(num[count-1]);
printf(" -> %d", num[count]);
int found = 0;
for(int i = 0; i < count; i++)
if(num[i] == num[count]) { found = 1; break; }
if(found) break;//
count++;
}
printf("\n");
return 0;
}
//for(int i = 0; i < count; i++)
// if(num[i] == num[count]) { found = 1; break; }
//出现相同的值就退出:因为在6174之前如果有相同的值那就会陷入死循环
//不符合题意且不可能存在
//所以用是否出现相同的值代替是否是6174进行判断
//如果是我写-利用判断是否是6174作为退出条件
#include<stdio.h>
int high[4],low[4];
void change_into_array(int n)
{
high[0]=n/1000;
high[1]=n%1000/100;
high[2]=n%1000%100/10;
high[3]=n%1000%100%10;
}
void set_in_order()
{
int i,j,t;
for(i=0;i<3;i++)
{
for(j=0;j<3-i;j++)
{
if(high[i]<high[j])
{
t=high[i];
high[i]=high[j];
high[j]=t;
}
}
}
for(i=0;i<4;i++)
low[i]=high[3-i];
}
int result()
{
int c,b;
c=high[0]*1000+high[1]*100+high[2]*10+high[3];
b=low[0]*1000+low[1]*100+low[2]*10+low[3];
return c-b;
}
int main()
{
int n,a;
scanf("%d",&n);
while(a!=6174)
{
change_into_array(n);
set_in_order();
a=n;
printf("%d->",a);
a=result();
}
}
//方法二显然耗费内存较多,效率底下...
//其实两个方法思路相同,步骤也大致相同,不同的是判断条件不一样
//有些题目有隐性判断条件 找出来省事
//还有一个改进版虽然也没改进到哪里去,而且这个在某些测试点下是段错误
#include<stdio.h>//段错误-内存 时间
int in[4];
void put(int num)
{
in[0] = num / 1000;
in[1] = (num % 1000) / 100;
in[2] = (num % 1000 % 100) / 10;
in[3] = num % 1000 % 10 % 10;
}
int main()
{
int i, j, sum1, sum2, t, n;
int high[4];
scanf_s("%d", &n);
put(n);
do
{
for (i = 0; i<3; i++)
for (j = 0; j<3 - i; j++)
{
if (in[j]<in[j + 1])
{
t = in[j];
in[j] = in[j + 1];
in[j + 1] = t;
}
}
for (i = 0; i<4; i++)
high[i] = in[i];
sum1 = (high[0] * 1000 + high[1] * 100 + high[2] * 10 + high[3]);
sum2 = (high[3] * 1000 + high[2] * 100 + high[1] * 10 + high[0]);
put(sum1 - sum2);
printf("%d%d%d%d-%d%d%d%d=%d%d%d%d\n", high[0], high[1], high[2], high[3], high[3], high[2], high[1], high[0], in[0], in[1], in[2], in[3]);
if (in[0] == 0 && in[1] == 0 && in[2] == 0 && in[3] == 0)
break;
} while (in[0] * 1000 + in[1] * 100 + in[2] * 10 + in[3] != 6174);
return 0;
}//有输出格式的要求所以才用四位
//pat-basic level
有没有更方便的解法.....
c++的类??
等我回来试试.....