这一题是求一个数是否自身对称, 如121,1221。如果不对称,就将原数反转,然后跟原来的数相加,结果判断是否是对称,不对称则重复上述操作直到找到对称的数,或者次数达到10次。如123, 不是对称的,加上其反转,123+321=444,444是对称的,输出“444 is a palindromic number.”。
注意点:
1、输入数字后要判断原数是否符合条件,符合输出结束。
2、数字最大位数为1000位,要用数组来处理数字的加减
3、虽然输入的位数是1000位以内,相加的结果可能超过1000位(这是最后一个测试点)
#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(int d[],int length){
int i=0,j=length-1;
while(i<j&&d[i]==d[j]){
i++;j--;
}
if(j<=i){
return true;
}
return false;
}
void printArray(int a[],int length){
for(int i =0 ;i<length;i++){
printf("%d",a[i]);
}
}
int main()
{
int a[1005];
int b[1005];
int c[1005];
char digch[1005];
scanf("%s",digch);
int digLength = strlen(digch);
int j = digLength;
for(int i=0;i<digLength;i++){
a[i] = digch[i] - '0';
b[--j] = a[i];
}
int mod= 0;
int k=0;
int orginalLength;
//原数是否满足条件
if(isPalindrome(a,digLength)){
printArray(a,digLength);
printf(" is a palindromic number.\n");
}
else{
for(k=0;k<10;k++){
orginalLength=j = digLength;
for(int i=0;i<digLength;i++){
b[--j] = a[i];
}
//相加
for(int i= digLength - 1;i >= 0;i--){
c[i] = (a[i] +b[i] + mod ) % 10;
mod = (a[i] +b[i] + mod ) / 10;
}
//最高位是否有进位
if(mod > 0){
for(int i=digLength;i>0;i--)
c[i]= c[i-1];
c[0] =mod;
mod = 0;
digLength++;
}
//输出
printArray(a,orginalLength);
printf(" + ");
printArray(b,orginalLength);
printf(" = ");
printArray(c,digLength);
printf("\n");
//判断是否满足条件
if(isPalindrome(c,digLength)){
printArray(c,digLength);
printf(" is a palindromic number.\n");
break;
}
for(int i=0;i<digLength;i++){
a[i] = c[i];
}
}
if(k>=10){
printf("Not found in 10 iterations.\n");
}
}
return 0;
}