题意:一个数A是对称的,则称为回文数,如果一个数不是回文数,通过有限次加法可以得出一个回文数,加法原则为将原数A与它的逆转数B相加的值赋予原数A=A+B,如:1234(原数)+4321(逆转数)=5555,并输出每次加法的式子,直到原数为回文数为止,然后输出“A is a palindromic number.”;如果10次加法后,仍不是回文数,输出“Not found in 10 iterations.”
思路:(1)判断输入数A是否为回文数,并判断加法次数是否小于等于10,是按条件输出,结束,否执行(2)
(2)将其与其逆转数相加的值赋予它。执行(1)
代码:三个函数,求和,逆转,判断,逆转后求和比较方便。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char num[1001];
int judge(char str[],int n)
{
int i,m=n/2;
for(i=0;i<m;i++)
{
if(str[i]!=str[n-1-i])return 0;
}
return 1;
}
void rev(char a[],int n)
{
int i;
char c;
for(i=0;i<n/2;i++)
{
c=a[i];
a[i]=a[n-1-i];
a[n-1-i]=c;
}
}
void ad_1(char str[],int *p)
{
int n=*p;
char b[1001]={""};
int i,flag=0;
printf("%s + ",str);
strcpy(b,str);
rev(str,n);
printf("%s = ",str);
for(i=0;i<n;i++)
{
int x;
x=str[i]+b[i]+flag-48*2;
if(x>9)str[i]=x+38,flag=1;
else str[i]=x+48,flag=0;
}
if(flag==1)
{
str[n]=49;
n++;
*p=n;
}
rev(str,n);
printf("%s\n",str);
}
int main()
{
int i=0,n,*p;
scanf("%s",num);
n=strlen(num);
p=&n;
while(judge(num,n)==0)
{
if(i==10)
{
printf("Not found in 10 iterations.\n");
return 0;
}
ad_1(num,p);
i++;
}
printf("%s is a palindromic number.\n",num);
return 0;
}