算法竞赛入门经典-第五章6174问题

来源:互联网 发布:贵阳广电网络公司地址 编辑:程序博客网 时间:2024/05/19 04:04
#include<stdio.h>
#include<string.h>
int get_next(int x) {
  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++的类??

等我回来试试.....

0 0
原创粉丝点击