问题描述: 任取一个正整数,如果不是回文数,将该数与它的倒序相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。 例如:将68变为154(68+86),再变成605(154+451),最后变成1111(605+506),而1111是回文数。 于是有科学家提出一个猜想:不论开始时什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数。 请你编程验证。 |
要求: 使用顺序表存储运算过程中产生的正整数,最后对所有数据进行显示。 |
#include<stdio.h>
typedef long DATA_TYPE;
typedef unsigned char boolean;
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef struct SQ_LIST{
DATA_TYPE data[MAXSIZE];
int count;
}LIST;
void initList(LIST *head);
void appendListElement(LIST *head, DATA_TYPE value);
void showList(LIST list);
DATA_TYPE reverse(DATA_TYPE x);
boolean isPalindrome(DATA_TYPE x);
boolean isPalindrome(DATA_TYPE x){
DATA_TYPE y;
y = reverse(x);
if(y == x){
return TRUE;
}else{
return FALSE;
}
}
DATA_TYPE reverse(DATA_TYPE x){
DATA_TYPE y = 0;
DATA_TYPE tmp = x;
while(tmp){
y = tmp%10 + y*10;
tmp/=10;
}
return y;
}
void showList(LIST list){
int i;
printf("当前顺序表中的元素为:");
for(i = 0; i < list.count; i++){
printf("%d ", list.data[i]);
}
printf("\n");
}
void appendListElement(LIST *head, DATA_TYPE value){
head->data[head->count++] = value;
}
void initList(LIST *head){
head->count = 0;
}
void main(void){
LIST list;
DATA_TYPE x = 55;
DATA_TYPE y;
initList(&list);
printf("请输入一个正整数:");
scanf("%d", &x);
appendListElement(&list, x);
if(isPalindrome(x)){
appendListElement(&list, x);
}else{
y = x + reverse(x);
appendListElement(&list, y);
if(isPalindrome(y))
while(!isPalindrome(y)){
y = y + reverse(y);
appendListElement(&list, y);
}
}
showList(list);
}