实验2 顺序表的应用(回文数猜想)

问题描述:

任取一个正整数,如果不是回文数,将该数与它的倒序相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。

例如:将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);

}

猜你喜欢

转载自blog.csdn.net/weixin_42072280/article/details/83629080