问题描述

  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
  输入一行,包含一个正整数n。
输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
  1<=n<=54。 
根据学校oj上的一个回文数题目想到的思路,不晓得是不是最简单的思路。主要是打表,两个表,一个是回文数表,一个是和的表,下表要对应。回文数用数组推导出来。
#include <stdio.h>

int num[1801] = {0};
int tsum[1801] = {0};

int main()
{
  int num1[5] = {0};
  int num2[6] = {0}; 
  tsum[0] = 2;
  int sum = 0;
  int count = 0;
  int tcount = 1;
  num1[0] = 1;
  num1[4] = 1;
  num2[0] = 1;
  num2[5] = 1;
  for(int i=0;i<5;i++)
  {
    sum = sum*10+num1[i];
  }
  num[count++] = sum;

  while(sum != 99999)   //处理五位数(打表) 
  {
    sum = 0;
    num1[2]++;
    for (int i = 2; i > 0; i--) //进位
    {
      if (num1[i] == 10)
      {
        num1[i - 1] ++;
        num1[i] = 0;
      }
      if (num1[i - 1] < 9)
      {
        break;
      }
    }
    for (int i = 0; i < 2; i++)    //左右相等
    {
      num1[5 - i - 1] = num1[i];
    }

    for(int i=0;i<5;i++)
    {
      tsum[tcount] += num1[i];
    }
    tcount++;

    for(int i=0;i<5;i++)
    {
      sum = sum*10+num1[i];
    }
      num[count++] = sum;
}

  for(int i=0;i<6;i++)
  {
    sum = sum*10+num2[i];
  }
  tsum[tcount++] = 2;
  num[count++] = sum;
  while(sum != 999999)   //处理六位数(打表) 
  {
    sum = 0;
    num2[2]++;
    for (int i = 2; i > 0; i--) //进位
    {
      if (num2[i] == 10)
      {
        num2[i - 1] ++;
        num2[i] = 0;
      }
      if (num2[i - 1] < 9)
      {
        break;
      }
    }
    for (int i = 0; i < 3; i++)    //左右相等
    {
      num2[6 - i - 1] = num2[i];
    }

    for(int i=0;i<6;i++)
    {
      tsum[tcount] += num2[i];
    }
    tcount++;

    for(int i=0;i<6;i++)
    {
      sum = sum*10+num2[i];
    }
      num[count++] = sum;
}
int n = 0;
  while(scanf("%d",&n) != EOF)
  {
    for(int i=0;i<1800;i++)
    {
      if(tsum[i] == n)
      {
        printf("%d\n",num[i]);
      }
    }
  }


  printf("%d\n",count);

  return 0;
}
最后修改:2019 年 02 月 26 日
如果觉得我的文章对你有用,请随意赞赏