pat乙级1079C语言

1079 延迟的回文数 (20分)

给定一个 k+1 位的正整数 N,写成 a​k⋯a1a0的形式,其中对所有 i 有 0≤ai<10 且 ak>0。N 被称为一个回文数,当且仅当对所有 i 有 ai=ak−i。零也被定义为一个回文数。
非回文数也可以通过一系列操作变出回文数。首先将该数字逆转,再将逆转数与该数相加,如果和还不是一个回文数,就重复这个逆转再相加的操作,直到一个回文数出现。如果一个非回文数可以变出回文数,就称这个数为延迟的回文数。(定义翻译自 https://en.wikipedia.org/wiki/Palindromic_number )
给定任意一个正整数,本题要求你找到其变出的那个回文数。
输入格式:

输入在一行中给出一个不超过1000位的正整数。
输出格式:

对给定的整数,一行一行输出其变出回文数的过程。每行格式如下
A + B = C
其中 A 是原始的数字,B 是 A 的逆转数,C 是它们的和。A 从输入的整数开始。重复操作直到 C 在 10 步以内变成回文数,这时在一行中输出 C is a palindromic number.;或者如果 10 步都没能得到回文数,最后就在一行中输出 Not found in 10 iterations.。
输入样例 1:

97152
输出样例 1:

97152 + 25179 = 122331
122331 + 133221 = 255552
255552 is a palindromic number.
输入样例 2:

196
输出样例 2:

196 + 691 = 887
887 + 788 = 1675
1675 + 5761 = 7436
7436 + 6347 = 13783
13783 + 38731 = 52514
52514 + 41525 = 94039
94039 + 93049 = 187088
187088 + 880781 = 1067869
1067869 + 9687601 = 10755470
10755470 + 07455701 = 18211171
Not found in 10 iterations.

思路

这里用整型做是不行的,因为他要求的倒数跟原来的数的位数一样,用整型的话要是原来的数的最后一位数是0,那倒数就少一位,所以最后肯定要用字符来做

#include
#include

void reverse(char *a)//求逆转数
{
  char ch;
  for(int i=0;i<strlen(a)/2;i++)
  {
    ch=a[i];
    a[i]=a[strlen(a)-1-i];
    a[strlen(a)-1-i]=ch;
  }
}

int judge(char *a)//判断回文数
{
  for(int i=0;i<strlen(a)/2;i++)
  {
    if(a[i]!=a[strlen(a)-1-i])
    {
      return 0;
    }
  }
  return 1;
}

int main()
{
  char number[1011]={0},numbers[1011]={0},sum[1011]={0},sum2[1011]={0};
  scanf("%s",number);
  if(judge(number))//如果给的第一个数就是回文数
  {
    printf("%s is a palindromic number.",number);
  }
  else
  {
    int count=0;//计数
    while(1)
    {
      strcpy(numbers,number);//备份
      reverse(number);//获取逆转数
      int jinwei=0;
      for(int i=strlen(numbers)-1;i>=0;i--)//对逆转数和原数进行相加
      {
        int a=0,b=0;
        a=numbers[i]-'0';
        b=number[i]-'0';
        if(a+b+jinwei<10)
        {
          sum[i]=a+b+jinwei+'0';
          jinwei=0;
        }
        else
        {
          sum[i]=(a+b+jinwei)%10+'0';
          jinwei=(a+b+jinwei)/10;
        }
      }
      if(jinwei)//如果最高位相加还有进位,要加上最高位的进位
      {
        sum2[0]=jinwei+'0';
        for(int i=0;i<strlen(number);i++)
        {
          sum2[i+1]=sum[i];
        }
        strcpy(sum,sum2);
      }
      if(judge(sum))//如果相加后的数是回文
      {
        printf("%s + %s = %s\n",numbers,number,sum);
        printf("%s is a palindromic number.",sum);
        break;
      }
      else
      {
        printf("%s + %s = %s\n",numbers,number,sum);
        count++;
        if(count>=10)//如果次数大于10
        {
          printf("Not found in 10 iterations.");
          break;
        }
        strcpy(number,sum);//交换位置,进行下次计算
      }
    }
  }
}

你可能感兴趣的:(pat考试,pat,c语言)